Tema 1 - Kprobe based tracer

  • Termen de predare: Miercuri, 26 Martie 2014, ora 23:00

Obiectivele temei

  • dobândirea de cunoştinţe legate de instrumentarea funcţiilor din nucleul Linux (mecanismul kprobes)
  • obţinerea de cunoştinţe legate de interacţiunea cu sistemul de fişiere /proc din nucleul Linux.
  • obținerea de deprinderi de lucru cu structurile de date specifice nucleului Linux (hash, list).

Enunț

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

Prin acest inspector ne propunem să interceptăm:

  • apelurile kmalloc și kfree
  • apelul schedule
  • apelurile up și down_interruptible
  • apelurile 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.

Detalii de implementare

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:

  • primul argument reprezintă cererea către subsistemul de monitorizare.
    • TRACER_ADD_PROCESS
    • TRACER_REMOVE_PROCESS
  • al doilea argument reprezintă PID-ul procesului pentru care se va executa cererea de monitorizare.

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:

  • se va folosi o probă de tip kretprobe, care va reţine cantitatea de memorie alocată şi adresa zonei de memorie alocată.
  • se vor folosi câmpurile .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

Testare

  • Corectarea temelor se va realiza automat cu ajutorul unei suite de teste publice.
  • Indicații despre utilizarea suitei de teste se găsesc în fișierul README din cadrul arhivei.
  • Pentru evaluare și corectare tema va fi uploadată folosind interfața vmchecker.
  • Suita de teste conține un set de teste. Trecerea unui test conduce la obținerea punctajului aferent acestuia.
    • În urma rulării testelor, se va acorda, în mod automat, un punctaj total. Punctajul total maxim este de 100 de puncte, pentru o temă care trece toate testele.
  • Pot exista penalizări în caz de întârzieri sau pentru neajunsuri de implementare sau de stil.
  • Penalizările pentru neajunsuri de implementare pot constitui maxim 10 puncte din nota finală a temei.
    • Pe lângă penalizările precizate în cadrul listei de depunctări, se vor avea în vedere următoarele elemente:
      • -2: omiterea eliminării corespunzătoare a resurselor (kprobes, intrări în /proc)
      • -2: probleme de sincronizare la date folosite de mai multe instanțe de execuție (spre exemplu, lista/tabela de hash cu procese)

Resurse de suport

  • Documentation/kprobes.txt - descrierea subsystemului kprobes din sursele nucleului Linux.
  • samples/kprobes/ - câteva exemple de folosire a kprobes din sursele nucleului Linux.

Suport, întrebări și clarificări

so2/teme/challenge-old.txt · Last modified: 2014/03/12 23:20 by daniel.baluta
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0