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.c
procfs
procfs
î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.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
.