This shows you the differences between two versions of the page.
so2:laboratoare:lab05:exercitii [2018/03/21 11:35] ionel.ghita |
so2:laboratoare:lab05:exercitii [2019/03/20 11:49] (current) gabriel.bercaru [1. [2.5p] Alocare de porturi I/O] - fixed typo ('kdb' instead of 'kbd') |
||
---|---|---|---|
Line 141: | Line 141: | ||
Descărcați modulul din kernel folosind comanda<code> | Descărcați modulul din kernel folosind comanda<code> | ||
- | rmmod kdb | + | rmmod kbd |
</code> și verificați acum conținutul fișierului ''/proc/ioports''; observți că a dispărut alocarea spațiului I/O pentru cele două porturi. | </code> și verificați acum conținutul fișierului ''/proc/ioports''; observți că a dispărut alocarea spațiului I/O pentru cele două porturi. | ||
Line 207: | Line 207: | ||
<note tip> | <note tip> | ||
Pentru afișare în cadrul handler-ului de întrerupere folosiți o construcție de forma:<code> | Pentru afișare în cadrul handler-ului de întrerupere folosiți o construcție de forma:<code> | ||
- | pr_info("IRQ:% d, scancode = 0x% x (% u,% c) \ n" | + | pr_info("IRQ %d: scancode=0x%x (%u) pressed=%d ch=%c\n", |
- | irq_no, scancode, scancode, scancode); | + | irq_no, scancode, scancode, pressed, ch); |
</code> | </code> | ||
unde ''scancode'' este valoarea registrului citit cu ajutorul funcției ''i8042_read_data()''. | unde ''scancode'' este valoarea registrului citit cu ajutorul funcției ''i8042_read_data()''. | ||
Line 256: | Line 256: | ||
<note tip> | <note tip> | ||
Pentru afișare în cadrul handler-ului de întrerupere folosiți o construcție de forma:<code> | Pentru afișare în cadrul handler-ului de întrerupere folosiți o construcție de forma:<code> | ||
- | printk(LOG_LEVEL "IRQ %d: scancode=0x%x (%u) pressed=%d ch=%c\n", | + | pr_info(LOG_LEVEL "IRQ %d: scancode=0x%x (%u) pressed=%d ch=%c\n", |
irq_no, scancode, scancode, pressed, ch); | irq_no, scancode, scancode, pressed, ch); | ||
</code> | </code> | ||
Line 279: | Line 279: | ||
Dimensiunea curentă a buffer-ului este dată de câmpul ''count'' din structura de tip ''struct kbd'' aferentă dispozitivului. Câmpul ''put_idx'' specifică următoarea poziție de scriere, iar ''get_idx'' următoarea poziție de citire. Urmăriți implementarea funcției ''put_char'' pentru a observa cum sunt adăugate datele în buffer-ul circular. | Dimensiunea curentă a buffer-ului este dată de câmpul ''count'' din structura de tip ''struct kbd'' aferentă dispozitivului. Câmpul ''put_idx'' specifică următoarea poziție de scriere, iar ''get_idx'' următoarea poziție de citire. Urmăriți implementarea funcției ''put_char'' pentru a observa cum sunt adăugate datele în buffer-ul circular. | ||
</note> | </note> | ||
- | ==== 4. [2.5p] Citirea bufferului printr-un apel ''read'' ==== | + | ==== 4. [2p] Citirea bufferului printr-un apel ''read'' ==== |
Pentru a avea acces la datele colectate de keylogger va trebui să le transmitem în user space. Facem acest lucru prin intermediului unui dispozitiv de tip caracter (''/dev/kbd''). La citirea din acest dispozitiv de tip caracter vom primi datele din buffer-ul din kernel space în care am colectat tastele apăsate. | Pentru a avea acces la datele colectate de keylogger va trebui să le transmitem în user space. Facem acest lucru prin intermediului unui dispozitiv de tip caracter (''/dev/kbd''). La citirea din acest dispozitiv de tip caracter vom primi datele din buffer-ul din kernel space în care am colectat tastele apăsate. | ||
Line 324: | Line 324: | ||
O să obțineți conținutul bufferului keylogger-ului din kernel space. | O să obțineți conținutul bufferului keylogger-ului din kernel space. | ||
- | ==== 5. [1p] Curățarea buffer-ului la scriere ==== | + | ==== 5. [1.5p] Curățarea buffer-ului la scriere ==== |
Dorim să %%"curățăm"%% buffer-ul atunci când se scrie în device node-ul asociat driver-ului. În acel moment buffer-ul va fi resetat: conținutul său va fi resetat și dimensiunea va fi ''0''. | Dorim să %%"curățăm"%% buffer-ul atunci când se scrie în device node-ul asociat driver-ului. În acel moment buffer-ul va fi resetat: conținutul său va fi resetat și dimensiunea va fi ''0''. |