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 kfree
schedule
up
și down_interruptible
mutex_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_PROCESS
TRACER_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.