This is an old revision of the document!
Pentru desfășurarea laboratorului pornim de la arhiva de sarcini a laboratorului. Descărcăm și decomprimăm arhiva în directorul so2/ din directorul home al utilizatorului student de pe sistemul de bază (stația mjolnir):
student@mjolnir:~$ cd so2/ student@mjolnir:~/so2$ wget http://elf.cs.pub.ro/so2/res/laboratoare/lab11-tasks.zip student@mjolnir:~/so2$ unzip lab11-tasks.zip student@mjolnir:~/so2$ tree lab11-tasks
În cadrul directorului lab11-tasks/ se găsesc resursele necesare pentru dezvoltarea exercițiilor de mai jos: fișiere schelet de cod sursă, fișiere Makefile și Kbuild, scripturi și programe de test.
Vom dezvolta exercițiile pe sistemul de bază (stația mjolnir) și apoi le vom testa pe mașina virtuală QEMU. După editarea și compilarea unui modul de kernel îl vom copia în directorul dedicat pentru mașina virtuală QEMU folosind o comandă de forma
student@mjolnir:~/so2$ cp /path/to/module.ko ~/so2/qemu-so2/fsimg/root/modules/
unde /path/to/module.ko este calea către fișierul obiect aferent modulului de kernel. Apoi vom porni, din directorul ~/so2/qemu-so2/ mașina virtuală QEMU folosind comanda
student@mjolnir:~/so2/qemu-so2$ make
După pornirea mașinii virtuale QEMU vom putea folosi comenzi în fereastra QEMU pentru a încărca și descărca modulul de kernel:
# insmod modules/module-name.ko # rmmod module/module-name
unde module-name este numele modulului de kernel.
Ctrl+Alt+t. Cele trei tab-uri de terminal îndeplinesc următoarele roluri:
~/so2/qemu-so2/.student@mjolnir:~$ netcat -lup 6666
lin/kmmap/ pentru a crea o mapare a memoriei driver-ului în user-space.kmalloc.TODO 1.NPAGES+1 pagini folosind kmalloc.kmalloc_area.NPAGES+1 este necesară pentru aliniere.kmalloc_ptr (variabilă globală) obținută în urma apelului kmalloc trebuie aliniată la adresa unei pagini.kmalloc_area = (char *)((((unsigned long)kmalloc_ptr) + PAGE_SIZE - 1) & PAGE_MASK);
PG_reserved al fiecărei pagini cu ajutorul funcțiilor SetPageReserved (în funcția de inițializare a modulului), respectiv ClearPageReserved (în funcția de ieșire a modulului).SetPageReserved și ClearPageReserved.0xaa,0xbb,0xcc,0xdd.mmap pentru driver.pfn – page frame number).kmalloc_area) în adresă fizică utilizați virt_to_phys.pfn.lin/test.make../mmap-test.matched.lin/vmmap/ pentru a crea o mapare a memoriei driver-ului în user-space.vmalloc.TODO 2.NPAGES pagini în funcția de inițializare a modulului folosind vmalloc.vmalloc_area (variabilă globală).vmalloc întoarce adrese aliniate la dimensiunea paginii; nu este nevoie de operații suplimentare.PG_reserved al fiecărei pagini cu ajutorul funcțiilor SetPageReserved (în funcția de inițializare a modulului), respectiv ClearPageReserved (în funcția de ieșire a modulului);SetPageReserved și ClearPageReserved.0xaa,0xbb,0xcc,0xdd.mmap pentru driver.vmalloc nu sunt fizic contigue.vmalloc_area) cu câte o pagină și veți obține pentru fiecare adresă virtuală astfel obținută pfn-ul. vmalloc_area_ptr pentru parcurgerea spațiului virtual din kernel space.vmalloc_area.lin/test.make../mmap-test.matched.mmap și cu apeluri de tipul read și write.TODO 3.offset trimis operației de read/write.lin/test.TASK_3 în mmap_test.cprocfsprocfs în care să afișați totalul memoriei mapate de procesul apelant.TODO 4.procfs (PROC_ENTRY_NAME, definit în mmap-test.h) care va afișa totalul memoriei mapate de procesul care a apelat read-ul pe acel fișier. Folosiți apelul proc_create.mode folosiți 0, iar pentru parametrul parent folosiți NULL.my_proc_file_ops.PROC_ENTRY_NAME folosind remove_proc_entry.
create_proc_entry nu mai este disponibilă în versiunea 3.13 a kernelului. Va trebui să folosiţi funcţia proc_create, care primeşte ca parametru suplimentar un pointer către operaţiile de tip fişier ce vor fi folosite pentru intrarea procfs.
my_seq_show va trebui să:current de tip struct task_struct *.vma_iterator.mm->mmap.vm_next al vm_area_struct pentru a parcurge lista de zone de memorie (vma-uri – virtual memory areas).NULL.vm_start și vm_end pentru fiecare structură pentru a deduce dimensiunea totală.printk("%lx %lx\n, ... ), vm_start și vm_end pentru fiecare structură vm_area_struct.\n).single_open puteți folosi NULL.lin/test.TASK_4 în mmap_test.c.sleep internă).pmap pentru a vedea mapările testului și a le compara cu cele obținute.pmap $(pidof mmap-test)
Alt+F2.Alt+F1.