This shows you the differences between two versions of the page.
|
so2:teme:tema1 [2018/03/16 12:38] elena.sandulescu [Tema 1 - Kprobe based tracer] |
so2:teme:tema1 [2020/03/17 17:42] (current) lucian.teodorescu [Resurse] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Tema 1 - Kprobe based tracer ====== | ====== Tema 1 - Kprobe based tracer ====== | ||
| - | * Termen de predare: ** Joi, 29 Martie 2018, ora 23:00** | + | * Termen de predare: 29 Martie 2020, ora 23:00 |
| - | <note>29 Martie 2018 este joi.</note> | + | |
| ===== Scopul temei ===== | ===== Scopul temei ===== | ||
| - | * dobândirea de cunoștinţe legate de instrumentarea funcțiilor din nucleul Linux (mecanismul ''kprobes'') | + | * dobândirea de cunoștinţe legate de instrumentarea funcțiilor din nucleul Linux (mecanismul ''kretprobes'') |
| * obținerea de cunoștințe legate de interacțiunea cu sistemul de fişiere ''/proc'' din nucleul Linux. | * 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 table'', ''list''). | * obținerea de deprinderi de lucru cu structurile de date specifice nucleului Linux (''hash table'', ''list''). | ||
| Line 23: | Line 23: | ||
| Inspectorul va fi implementat ca un modul de kernel cu numele ''tracer.ko''. | Inspectorul va fi implementat ca un modul de kernel cu numele ''tracer.ko''. | ||
| + | |||
| ==== Detalii de implementare ==== | ==== 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ă/tabelă de dispersie cu procesele monitorizate și va contabiliza informațiile de mai sus pentru aceste procese. | + | 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/tebelei 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 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: |
| * primul argument reprezintă cererea către subsistemul de monitorizare: | * primul argument reprezintă cererea către subsistemul de monitorizare: | ||
| * ''TRACER_ADD_PROCESS'' | * ''TRACER_ADD_PROCESS'' | ||
| Line 38: | Line 39: | ||
| Întrucât funcţia ''kmalloc'' este inline pentru instrumentarea cantităţii de memorie allocate se va inspecta funcţia ''%%__kmalloc%%'', astfel: | Î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 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'' | + | * se vor folosi câmpurile ''.entry_handler'' şi ''.handler'' din structura ''kretprobe'' pentru a retine informatii despre cantitatea de memorie alocata si adresa de unde incepe memoria alocata. |
| + | |||
| + | <code> | ||
| + | static struct kretprobe kmalloc_probe = { | ||
| + | .entry_handler = kmalloc_probe_entry_handler, /* entry handler */ | ||
| + | .handler = kmalloc_probe_handler, /* return probe handler */ | ||
| + | .maxactive = 32, | ||
| + | }; | ||
| + | </code> | ||
| Î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%%''. | Î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 fiecare funcție se va folosi o probă de tipul ''kprobe''. | + | Pentru restul functiilor de instrumentat este suficient sa folositi o proba de tipulul ''kretprobe'' |
| + | |||
| + | <code> | ||
| + | static struct kretprobe up_probe = { | ||
| + | .entry_handler = up_probe_handler, | ||
| + | .maxactive = 32, | ||
| + | }; | ||
| + | </code> | ||
| 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''. | 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''. | ||
| Line 62: | Line 79: | ||
| $ git clone https://github.com/linux-kernel-labs/linux.git | $ git clone https://github.com/linux-kernel-labs/linux.git | ||
| $ cd linux/tools/labs | $ cd linux/tools/labs | ||
| - | $ LABS=tracer_assignment make skels | + | $ LABS=assignments/1-tracer make skels |
| - | # dezvoltarea temei se va efectua în directorul kprobe-tracer/ | + | # dezvoltarea temei se va efectua în directorul skels/assignments/1-tracer/ |
| $ make build | $ make build | ||
| $ make copy | $ make copy | ||
| Line 77: | Line 94: | ||
| === checkpatch.pl === | === checkpatch.pl === | ||
| - | * <code bash> /path/to/linux-4.9.11/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/src-file.c </code> | + | * <code bash> scripts/checkpatch.pl --no-tree --strict -f /path/to/your/src-file.c </code> |
| === sparse === | === sparse === | ||
| * <code bash> sudo apt-get install sparse </code> | * <code bash> sudo apt-get install sparse </code> | ||
| * <code bash> | * <code bash> | ||
| - | cd /path/to/linux-4.9.11 | ||
| make C=2 /path/to/your/src-file.c </code> | make C=2 /path/to/your/src-file.c </code> | ||
| Line 90: | Line 106: | ||
| Depunctările generale pentru teme se găsesc pe pagina de [[so2:teme:general| Indicații generale]]. În plus, se vor avea în vedere următoarele elemente: | Depunctările generale pentru teme se găsesc pe pagina de [[so2:teme:general| Indicații generale]]. În plus, se vor avea în vedere următoarele elemente: | ||
| - | ***-2**: omiterea eliminării corespunzătoare a resurselor (kprobes, intrări în ''/proc'') | + | ***-2**: omiterea eliminării corespunzătoare a resurselor (kretprobes, intrări în ''/proc'') |
| ***-2**: probleme de sincronizare la date folosite de mai multe instanțe de execuție (spre exemplu, lista/tabela de dispersie cu procese) | ***-2**: probleme de sincronizare la date folosite de mai multe instanțe de execuție (spre exemplu, lista/tabela de dispersie cu procese) | ||
| Line 104: | Line 120: | ||
| ===== Resurse ===== | ===== Resurse ===== | ||
| - | * [[http://lxr.free-electrons.com/source/Documentation/kprobes.txt|Documentation/kprobes.txt]] - descrierea subsystemului kprobes din sursele nucleului Linux. | + | * [[https://www.kernel.org/doc/Documentation/kprobes.txt|Documentation/kprobes.txt]] - descrierea subsystemului kprobes din sursele nucleului Linux. |
| - | * [[http://lxr.free-electrons.com/source/samples/kprobes/|samples/kprobes/]] - câteva exemple de folosire a kprobes din sursele nucleului Linux. | + | * [[https://elixir.bootlin.com/linux/latest/source/samples/kprobes|samples/kprobes/]] - câteva exemple de folosire a kprobes din sursele nucleului Linux. |
| <note important> | <note important> | ||