Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:teme:tema1 [2018/03/25 19:01]
razvan.deaconescu [Testare]
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 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/​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 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 ​probă ​de tipul ''​kprobe''​.+Pentru ​restul functiilor de instrumentat este suficient sa folositi ​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=assignments/​1-tracer 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 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>​
so2/teme/tema1.1521993693.txt.gz · Last modified: 2018/03/25 19:01 by razvan.deaconescu
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