====== Test de evaluare finală ======
Pentru testul final, vă recomandăm să folosiți [[http://koala.cs.pub.ro/training/res/linux-kernel-dev/tests/final-test.zip|arhiva de suport a testului]].
===== Controlare timer prin ioctl =====
Creați un modul de kernel care folosește un apel ''ioctl()'' pentru a comanda pornirea și respectiv oprirea unui timer care afișează un mesaj la fiecare ''5'' secunde. În momentul în care modulul este scos din kernel, timer-ul se închide.
Porniți de la [[http://koala.cs.pub.ro/training/res/linux-kernel-dev/tests/final-test.zip|arhiva de suport a testului]]. În directorul ''ioctl-timer/'', în fișierul ''include/util.h'' sunt definite cele două comenzi ioctl pentru pornirea respectiv oprirea timer-ului. Este implementată componenta de test din user space în directorul ''user/''. Implementarea modulului o veți face în directorul ''kernel/'' pornind de la scheletul de acolo. Numele așteptat pentru dispozitiv este ''/dev/ioctl_timer'' cu majorul ''42'' și minorul ''0''.
Pentru implementare folosiți-vă de codul sursă folosit la capitolele parcurse până acum.
Pentru timere puteți folosi structura ''timer_list''. Informații despre timere găsiți în codul sursă în directorul ''include/linux/timer.h''.
Alte informații utile [[http://ocw.cs.pub.ro/courses/so2/laboratoare/lab06#timere|aici]].
**BONUS**: Adăugați o nouă comanda de tip ''ioctl'' cu ajutorul căreia să se configureze perioada timer-ului. Să nu fie configurată strict la ''5'' secunde. Se trimite acest număr din user space ca al treilea argument al apelului ''ioctl()''.
===== Afișarea informațiilor despre procesele copil =====
Creați un modul de kernel care afișează, pentru fiecare dintre procesele copil ale procesului init zonele sale de memorie.
Porniți de la [[http://koala.cs.pub.ro/training/res/linux-kernel-dev/tests/final-test.zip|arhiva de suport a testului]]. În directorul ''info-children/'' aveți un schelet de implementare în care este deja obținut pointer-ul la procesul ''init'' din kernel space.
Pentru implementare folosiți-vă de codul sursă folosit la capitolele parcurse până acum.
Trebuie să porniți de la santinela dată de câmpul ''children'' al structurii ''task_struct'' a procesului ''init''. Apoi să continuați parcurgerea în lista de copii folosind câmpul ''sibling'' din structurile ''task_struct'' ale proceselor copil.
Pentru parcurgerea listei de copii puteți folosi macro-ul ''list_for_each_entry()'' **sau** macro-urile ''list_for_each()'' și ''list_entry()''.
Pentru parcurgerea listei de zone de memorie, folosiți câmpul ''vm_next'' din structura ''vm_area_struct'' și opriți-vă când ajungeți cu pointer-ul iterator la ''NULL''.