====== 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''.