160 likes | 283 Views
Investigarea contoarelor de referință de la nivelul nucleului Linux. Emma – Camelia Mirică emma.mirica@gmail.com. As. Dr. Ing. Răzvan Deaconescu Ing. Daniel Băluță. Sesiunea de licenţă - Iulie 2012. Cuprins. Introducere Motivație Structura kref Captură Filtrare Procesare Concluzii
E N D
Investigarea contoarelor de referință de la nivelul nucleului Linux Emma – Camelia Miricăemma.mirica@gmail.com As. Dr. Ing. Răzvan Deaconescu Ing. Daniel Băluță • Sesiunea de licenţă - Iulie 2012
Cuprins • Introducere • Motivație • Structura kref • Captură • Filtrare • Procesare • Concluzii • Întrebări Sesiunea de Licenţă - Iulie 2012
Introducere • Contor de referință: • Număr ce reține câte referințe sunt către un anumit obiect • Metodă populară pentru administrarea memoriei • Garbage collection (Java, Python, PHP etc.) • Nucleul Linux • Reduce efortul de programare Sesiunea de Licenţă - Iulie 2012
Motivație Sesiunea de Licenţă - Iulie 2012
Structura kref kref_get kref_init kref_put Sesiunea de Licenţă - Iulie 2012
Aplicația în ansamblu Spațiu kernel Spațiu user Modulul kref-count Scriptul ref_leaks Funcții kref și parametrii modulului captură filtrare procesare Statistici (valori, liste, tabele) Sesiunea de Licenţă - Iulie 2012
Captură • Colectare într-un hash table și actualizare de informații utile despre structurile kref din nucleu • Id și nume proces de creare • Numărul de operații get și put • Hash table pentru contexte • În spațiul kernel, implementat în modulul kref-count Sesiunea de Licenţă - Iulie 2012
Captură (2) • Primă fază de control prin parametrii modulului: • nokref • omode • leaks Sesiunea de Licenţă - Iulie 2012
Filtrare • Filtrarea informațiilor colectate anterior după: • Valoare contor • Id proces • În spațiul kernel, implementat în modulul kref-count • Folosește procfs, adăugând un nou folder (/proc/kref_debug) cu intrările: • kref_filter: control filtrare • kref_0x<kref_addr>: rezultatele filtrării Sesiunea de Licenţă - Iulie 2012
Modulul kref-count Funcție kref NU DA kref nou NU Actualizare informații Verifică nokref Ignoră Verifică leaks DA Șterge kref și intrare din /proc, dacă există NU Verifică omode Ignoră NU DA Verifică filtru NU Adaugă noul kref DA Șterge intrare din /proc, dacă există NU Verifică filtru Adaugă noua intrare în /proc/kref_debug Ignoră DA Adaugă noua intrare în /proc/kref_debug Sesiunea de Licenţă - Iulie 2012
Procesare • Oferă statistici pe baza intrărilor din /proc/kref_debug • În user space, implementat în scriptul ref_leaks ref_leaks -h -v -s -w -a -t Intrări din /proc/kref_debug Statistici (valori, liste, tabele) -k -l -d -f -p -g Sesiunea de Licenţă - Iulie 2012
Concluzii • Aplicație complet funcțională • Analiză dinamică a contoarelor • Utilă pentru dezvoltatorii nucleului Linux • Ușor de folosit • Îmbunătățiri pot fi făcute: • Noi opțiuni pentru scriptul ref_leaks • Noi parametri pentru modulul kref-count Sesiunea de Licență- 2012
Cuvinte cheie • nucleul Linux • struct kref • modul de kernel • interceptare • script Python • procfs • captură • filtrare • procesare Vă Mulțumesc! Sesiunea de Licenţă - Iulie 2012
Interceptarea funcțiilor kref • Versiuni mai mici de 3.3 • funcțiile kref sunt externe • kprobes • fără modificări în sursele nucleului • fără necesitatea compilării și instalării unui nou nucleu • ușor de folosit Sesiunea de Comunicări Științifice Studențești - 2012
Interceptarea funcțiilor kref • Versiuni începând cu 3.3 • funcțiile kref sunt inline → kprobes • adăugarea apelurilor funcțiilor de hook în cadrul funcțiilor kref • adăugarea sursei kref_log.c • compilarea și instalarea unui nucleu nou Sesiunea de Licență - 2012
Probleme posibile • Memory leaks: • Contorul nu mai ajunge la 0, deci funcția de eliberare a memoriei nu mai este apelată • Deadlock: • Se încearcă eliberarea unei resurse într-un ciclu infinit • Este posibil ca o altă resursă să fie deținută și să nu poată fi eliberată Sesiunea de Licență - 2012