kprobes)/proc din nucleul Linux.hash, list).Realizați un inspector de operații de kernel.
Prin acest inspector ne propunem să interceptăm:
kmalloc și kfreescheduleup și down_interruptiblemutex_lock și mutex_unlock
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.
Interceptarea se va face întregistrând câte o probă (kprobe) pentru fiecare din funcţiile de mai sus. Inspectorul va reține o listă/hash de procese monitorizate și va contabiliza informațiile de mai sus pentru aceste procese.
Pentru controlul listei/hash-ului de procese 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:
TRACER_ADD_PROCESSTRACER_REMOVE_PROCESS
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:
kretprobe, care va reţine cantitatea de memorie alocată şi adresa zonei de memorie alocată..entry_handler şi .handler din structura kretprobe
Î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 toate celelalte funcţii se va folosi o probă de tipul jprobe. 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ă/hash și care își încheie execuția vor fi eliminate din listă/hash. De asemenea un proces va fi eliminat din lista/hash î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
README din cadrul arhivei./proc)Documentation/kprobes.txt - descrierea subsystemului kprobes din sursele nucleului Linux.samples/kprobes/ - câteva exemple de folosire a kprobes din sursele nucleului Linux.