This shows you the differences between two versions of the page.
so2:teme:tema1 [2018/03/26 10:29] razvan.deaconescu [Enunț] |
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 |
===== 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 27: | Line 27: | ||
==== 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/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 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: | ||
Line 39: | 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 63: | 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 1-tracer/ | + | # dezvoltarea temei se va efectua în directorul skels/assignments/1-tracer/ |
$ make build | $ make build | ||
$ make copy | $ make copy | ||
Line 78: | 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 91: | 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 105: | 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> |