Table of Contents

Test de evaluare finală

Pentru testul final, vă recomandăm să folosiți 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 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 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 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.