Table of Contents

Tema 1 - Kprobe based tracer

Scopul temei

Enunț

Realizați un inspector de operații de kernel.

Prin acest inspector ne propunem să interceptăm:

Inspectorul va reține, la nivel de proces, numărul de apeluri pentru fiecare dintre funcțiile de mai sus. În plus, pentru apelurile kmalloc şi kfree se afișează cantitatea totală de memorie alocată și eliberată.

Inspectorul va fi implementat ca un modul de kernel cu numele tracer.ko.

Detalii de implementare

Interceptarea se va face întregistrând câte o probă (kretprobe) pentru fiecare din funcţiile de mai sus. Inspectorul va reține o listă/tabelă de dispersie cu procesele monitorizate și va contabiliza informațiile de mai sus pentru aceste procese.

Pentru controlul listei/tabelei de dispersie cu procesele monitorizate, se va folosi un char device denumit /dev/tracer, cu majorul 10 și minorul 42. Acesta va expune o interfață ioctl cu două argumente:

Pentru a putea crea un char device cu majorul 10 va trebui să folosiţi interfaţa miscdevice din kernel. Definiţiile macro-urilor aferente se găsesc în header-ul tracer.h

Întrucât funcţia kmalloc este inline pentru instrumentarea cantităţii de memorie allocate se va inspecta funcţia __kmalloc, astfel:

static struct kretprobe kmalloc_probe = {
       .entry_handler = kmalloc_probe_entry_handler, /* entry handler */                                                                                                                                                               
       .handler = kmalloc_probe_handler, /* return probe handler */
       .maxactive = 32,
};

Întrucât funcţia kfree primeşte doar adresa zonei de memorie ce urmează a fi eliberată, pentru a determina cantitatea totală de memorie eliberată va trebui pe baza adresei zonei să determinăm dimensiunea ei. Acest lucru este posibil întrucât există o asociere adresa - dimensiune făcută la inspectarea funcţiei __kmalloc.

Pentru restul functiilor de instrumentat este suficient sa folositi o proba de tipulul kretprobe

static struct kretprobe up_probe = {
       .entry_handler = up_probe_handler,
       .maxactive = 32,
};

Kernel-ul din mașina virtuală are opțiunea CONFIG_DEBUG_LOCK_ALLOC activată unde simbolul mutex_lock este un macro care se expandează la mutex_lock_nested. Astfel, pentru a obține informații despre funcția mutex_lock va trebui să instrumentați funcția mutex_lock_nested.

Procesele care au fost adăugate în listă/tabela de dispersie și care își încheie execuția vor fi eliminate din listă/tabela de dispersie. De asemenea un proces va fi eliminat din lista/tabela de dispesie în urma operaţiei TRACER_REMOVE_PROCESS.

Informațiile reținute de inspector vor fi afișate prin intermediul sistemului de fișiere procfs, în fişierul /proc/tracer. Pentru fiecare proces monitorizat se creează o intrare în fişierul /proc/tracer având ca şi prim câmp PID-ul procesului. Intrarea va fi de tipul read-only, și o operație de citire pe aceasta va afișa rezultatele reținute. Un exemplu de afișare a conținutului intrării este:

$cat /proc/tracer
PID   kmalloc kfree kmalloc_mem kfree_mem  sched   up     down  lock   unlock
42    12      12    2048        2048        124    2      2     9      9
1099  0       0     0           0           1984   0      0     0      0
1244  0       0     0           0           1221   100   1023   1023   1002
1337  123     99    125952      101376      193821 992   81921  7421   6392

Testare

Pentru simplificarea procesului de corectare a temelor, dar și pentru a reduce greșelile temelor trimise, corectarea temelor se va face automat cu ajutorul testelor publice care se găsesc în noua infrastructură. Pentru testarea locală, folosiți următoarele comenzi:

$ git clone https://github.com/linux-kernel-labs/linux.git
$ cd linux/tools/labs
$ LABS=assignments/1-tracer make skels 
# dezvoltarea temei se va efectua în directorul skels/assignments/1-tracer/
$ make build
$ make copy
$ make boot

Sfaturi

Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul Coding Style.

De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul:

checkpatch.pl

sparse

cppcheck

Depunctări

Depunctările generale pentru teme se găsesc pe pagina de Indicații generale. În plus, se vor avea în vedere următoarele elemente:

În cazuri excepționale (tema trece testele prin nerespectarea cerințelor) și în cazul în care tema nu trece toate testele se poate scădea mai mult decât este menționat mai sus.

Submitere

Arhiva temei va fi submisă pe vmchecker, în conformitate cu precizările din pagina de reguli.

Din interfața vmchecker alegeți opțiunea Kprobe Based Tracer, aferentă acestei teme.

Resurse

Resursele temei se găsesc și în repo-ul linux, noua infrastructură. Repo-ul so2-assignments conține un script Bash care vă ajută să vă creați un repository privat pe instanța de GitLab a facultății. Urmăriți indicațiile din README și de pe pagina de Wiki dedicată pentru git.

Întrebări

Pentru întrebări legate de temă puteți consulta arhivele listei de discuții sau puteți trimite un e-mail (trebuie să fiți înregistrați). Vă rugăm să urmăriți și să respectați indicațiile de utilizare a listei.