This shows you the differences between two versions of the page.
so2:laboratoare:lab02:exercitii [2018/03/05 00:15] anda.nicolae [Extra: Pentru acasă] |
so2:laboratoare:lab02:exercitii [2019/02/25 15:18] (current) ionel.ghita [Extra] |
||
---|---|---|---|
Line 253: | Line 253: | ||
Repetați apoi operația de încărcare/descărcare. Observați că diferă PID-urile proceselor afișate. Acest lucru se întâmplă pentru că la încărcarea modulului se creează un proces pornind de la executabilul ''/sbin/insmod'' iar la descărcarea modulului se creează un proces pornind de la executabilul ''/sbin/rmmod''. Procesele vor fi diferite. | Repetați apoi operația de încărcare/descărcare. Observați că diferă PID-urile proceselor afișate. Acest lucru se întâmplă pentru că la încărcarea modulului se creează un proces pornind de la executabilul ''/sbin/insmod'' iar la descărcarea modulului se creează un proces pornind de la executabilul ''/sbin/rmmod''. Procesele vor fi diferite. | ||
- | ==== 8. [2.5p] Kprobes ==== | ||
- | **[0.5p]** Intrați în directorul ''8-kprobes/'' din arhiva de resurse a laboratorului. Urmăriți fișierul sursă ''kprobes.c''. Modulul folosește ''jprobes'' pentru a urmări apelul ''do_execve_common'', aferent apelului de sistem [[http://man7.org/linux/man-pages/man3/exec.3.html|exec]]. | + | ==== Extra ==== |
- | + | ||
- | Compilați și încărcați în mașina virtuală modulul de kernel rezultat (''kprobes.c''). Urmăriți mesajele de debug și comparați cu procesele existente în sistem. | + | |
- | + | ||
- | <note> | + | |
- | Este chiar exmplul din laborator din secțiunea [[:so2:laboratoare:lab02#Kprobes|Kprobes]]. | + | |
- | </note> | + | |
- | + | ||
- | **[2p]** Creați un modul care analizează valoarea de retur a funcției [[http://lxr.free-electrons.com/source/kernel/fork.c?v=4.9#L1904|_do_fork]]. La întoarcerea din funcție, afișați valoarea de retur, numele și pid-ul procesului părinte și pid-ul procesului curent. | + | |
- | + | ||
- | <note tip> | + | |
- | Revedeți secțiunea [[:so2:laboratoare:lab02#Kprobes|Kretprobes]]. | + | |
- | + | ||
- | Puteți urmări și exemplul de cod din sursele nucleului din [[https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/samples/kprobes/kretprobe_example.c?h=v3.13|samples/kprobes/kretprobe_example.c]]. | + | |
- | </note> | + | |
- | + | ||
- | <note tip> | + | |
- | Urmăriți comentariile marcate cu ''TODO'' din cadrul fișierului cod sursă ''kprobes.c''. | + | |
- | </note> | + | |
- | + | ||
- | <note tip> | + | |
- | Pentru a afișa adresa de retur în handler-ul de ''kretprobe'' (adică în funcțion ''my_ret_handler'') folosiți funcția [[http://lxr.free-electrons.com/source/arch/x86/include/asm/ptrace.h?v=3.13#L82|regs_return_value]]. | + | |
- | </note> | + | |
- | + | ||
- | <note tip> | + | |
- | Pentru a obține structura de tip ''struct task_struct *'' aferentă procesului părinte al procesului curent folosiți construcția ''%%current->parent%%''. | + | |
- | </note> | + | |
- | + | ||
- | <note> | + | |
- | Procesul interceptat de ''kretprobe'' este shell-ul. În mașina virtuală procesul său părinte este procesul ''init''/''busybox'' (cu PID-ul ''1''). Valoarea întoarsă de apelul [[http://lxr.free-electrons.com/source/kernel/fork.c?v=4.9#L1904|_do_fork]] afișată în cadrul handler-ului ''kretprobe'' este PID-ul procesului copil proaspăt creat, așa cum se întâmplă și în user space în cazul apelului [[http://man7.org/linux/man-pages/man2/fork.2.html|fork]] pentru procesul părinte. | + | |
- | </note> | + | |
- | + | ||
- | Puteți folosi comanda ''pstree -p'' pentru a afișa ierarhia de procese a sistemului și pentru a verifica astfel, informațiile afișate de handler-ul de ''kretprobe'' în modulul de kernel. Puteți, deasemenea, confirma acest lucru verificând pid-ul procesului din proba anterioară ( ''do_execveat_common''). | + | |
- | ==== Extra: Pentru acasă ==== | + | |
**1. [1KP] KDB** | **1. [1KP] KDB** | ||
- | Intrați în directorul ''9-kdb/''. Activați KDB peste serială și intrați în modul KDB folosind SysRq. | + | Intrați în directorul ''8-kdb/''. Activați KDB peste serială și intrați în modul KDB folosind SysRq. |
Conectați-vă la pseudo-terminalul conectat la virtiocon0 folosind minicom, configurați KDB pentru a folosi portul serial hvc0 (''echo hvc0 > /sys/module/kgdboc/parameters/kgdboc'') și activați-l folosind SysRq (Ctrl+O g). Analizați starea curentă a sistemului (''help'' pentru a vedea comenzile KDB disponibile). Continuați execuția kernelului folosind comand ''go''. | Conectați-vă la pseudo-terminalul conectat la virtiocon0 folosind minicom, configurați KDB pentru a folosi portul serial hvc0 (''echo hvc0 > /sys/module/kgdboc/parameters/kgdboc'') și activați-l folosind SysRq (Ctrl+O g). Analizați starea curentă a sistemului (''help'' pentru a vedea comenzile KDB disponibile). Continuați execuția kernelului folosind comand ''go''. | ||
Line 332: | Line 298: | ||
**4. [2KP] Dynamic Debugging** | **4. [2KP] Dynamic Debugging** | ||
- | Intrați în directorul ''10-dyndbg/'' și compilați modulul ''dyndbg.ko''. | + | Intrați în directorul ''9-dyndbg/'' și compilați modulul ''dyndbg.ko''. |
Familiarizați-vă cu sistemul de fișiere ''debugfs'' montat în ''/debug'' și analizați conținutul fișierului ''/debug/dynamic_debug/control''. Inserați modulul dyndbg.ko și observați noul conținut al fișierului ''dynamic_debug/control''. | Familiarizați-vă cu sistemul de fișiere ''debugfs'' montat în ''/debug'' și analizați conținutul fișierului ''/debug/dynamic_debug/control''. Inserați modulul dyndbg.ko și observați noul conținut al fișierului ''dynamic_debug/control''. |