V tomto cvičení preskúmate tabuľky stránok a upravíte ich za účelom implementácie funkcionalít, ktoré sú bežné v operačných systémoch.
Než začnete programovať, prečítajte si kapitolu 3 xv6 knižky a pozrite si príslušné súbory:
Nápomocný môže byť tiež manuál privilegovaných inštrukcií RISC-V.
Od tohto cvičenia môžete pracovať na vlastných laptopoch. Predpokladáme, že ste si na nich už nastavili synchronizáciu s vaším vzdialených repozitárom na GitHube podľa sekcie Stiahnutie repozitára na vlastný PC na stránke Synchronizácia repozitára. Ak chcete pracovať s počítačmi v miestnosti, postupujte podľa sekcie Stiahnutie repozitára na cvičení.
Najprv sa prepnite do vetvy pgtbl:
1 2 3 |
$ git fetch $ git switch pgtbl $ make clean |
Riešenia úloh z tohto cvičenia ukladajte do vetvy pgtbl.
Vašou prvou úlohou bude vysvetliť tabuľku stránok používateľského procesu, aby ste pochopili, ako fungujú tabuľky stránok na architektúre RISC-V.
Zavolajte make qemu a potom spustite používateľský program pgtbltest. Funkcia print_pgtbl
vypíše záznamy tabuľky stránok (PTE) pre prvých 10 a posledných 10 stránok procesu pgtbltest použitím systémového volania pgpte
, ktoré bolo pridané v tomto cvičení. Výstup vyzerá takto:
1 2 3 4 5 6 |
va 0 pte 0x21FCF45B pa 0x87F3D000 perm 0x5B va 1000 pte 0x21FCE85B pa 0x87F3A000 perm 0x5B ... va 0xFFFFD000 pte 0x0 pa 0x0 perm 0x0 va 0xFFFFE000 pte 0x21FD80C7 pa 0x87F60000 perm 0xC7 va 0xFFFFF000 pte 0x20001C4B pa 0x80007000 perm 0x4B |
Niektoré operačné systémy (napr. Linux) zrýchľujú určité systémové volania zdieľaním dát medzi jadrom a používateľským priestorom v pamäťovej oblasti s prístupom iba na čítanie. Vďaka tomu je možné eliminovať prechody do jadra počas systémových volaní. Aby ste sa naučili, ako fungujú pamäťové mapovania, vašou prvou úlohou je implementovať túto optimizáciu pre systémové volaniegetpid()
v xv6.
USYSCALL
(táto virtuálna adresa je definovaná v súbore memlayout.h). Na začiatku tejto stránky uložte štruktúru struct usyscall
(tiež definovaná v memlayout.h) a inicializujte ju tak, aby v nej bolo uložené PID aktuálneho procesu. Pre tento lab je z používateľského priestoru k dispozícii funkcia ugetpid()
, ktorá automaticky použije mapovanie USYSCALL
. Za implementáciu tejto úlohy získate plný počet bodov, ak prejdete testom ugetpid v súbore testov pgtbltest.Pomôcky:
allocproc()
. Vhodné je tiež niekam uložiť referenciu na alokovanú stránku, napríklad do štruktúry proc
, podobne ako sa ukladá proc->trapframe
a proc->pagetable
.proc_pagetable()
v súbore kernel/proc.c.
mappages()
sa vám môže hodiť.
freeproc()
a odmapovať v proc_freepagetable()
.
Ktoré iné systémové volania môžu byť urýchlené prostredníctvom tejto zdieľanej stránky? Vysvetlite ako.
Odpovede zapíšte do príslušných súborov podľa testovacieho skriptu.
Po úspešnom dokončení úlohy nezabudnite vytvoriť commit!
Vašou ďalšou úlohou je napísať funkciu, ktorá vypíše obsah tabuľky stránok. Pomôže vám to pri vizualizícii tabuliek stránok v RISC-V a funkciu môžete v budúcnosti použiť pri ladení systému.
kpgtbl()
, ktoré volá funkciu vmprint()
v súbore vm.c. Má jeden argument typu pagetable_t
. Vašou úlohou je vypísať tabuľku stránok vo formáte, ktorý je uvedený nižšie.
Keď spustíte test print_kpgtbl(), vaša implementácia by mala vypísať takýto výstup:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
page table 0x0000000087f6b000 page table 0x0000000086f2f000 ..0x0000000000000000: pte 0x0000000021bccc01 pa 0x0000000086f33000 .. ..0x0000000000000000: pte 0x0000000021bcd001 pa 0x0000000086f34000 .. .. ..0x0000000000000000: pte 0x0000000021bcc85b pa 0x0000000086f32000 .. .. ..0x0000000000001000: pte 0x0000000021bcd41b pa 0x0000000086f35000 .. .. ..0x0000000000002000: pte 0x0000000021bd3cd7 pa 0x0000000086f4f000 .. .. ..0x0000000000003000: pte 0x0000000021bd0c07 pa 0x0000000086f43000 .. .. ..0x0000000000004000: pte 0x0000000021bd10d7 pa 0x0000000086f44000 ..0x0000003fc0000000: pte 0x0000000021bcc001 pa 0x0000000086f30000 .. ..0x0000003fffe00000: pte 0x0000000021bcc401 pa 0x0000000086f31000 .. .. ..0x0000003fffffd000: pte 0x0000000021bc8413 pa 0x0000000086f21000 .. .. ..0x0000003fffffe000: pte 0x0000000021bc88c7 pa 0x0000000086f22000 .. .. ..0x0000003ffffff000: pte 0x000000002000184b pa 0x0000000080006000 |
V prvom riadku je argument funkcie vmprint
. Potom nasledujú riadky pre každý PTE, vrátane vnorených záznamov. Každý riadok PTE je odsadený znakmi ..
podľa toho, ako hboko v strome sa nachádza. Každý riadok obsahuje virtuálnu adresu, bity pte
a fyzickú adresu vytiahnutú z PTE. Nevypisujte neplatné záznamy. V príklade vyššie má tabuľka najvyššej úrovne mapovania pre záznamy 0 a 255. O úroveň nižšie, záznam 0 má namapovaný len index 0. Na najnižšej úrovni má tento index namapovaných niekoľko záznamov.
Fyzické adresy na vašom počítači môžu byť odlišné od tých v ukážke výstupu. Počet záznamov a virtuálne adresy by mali byť rovnaké.
Pomôcky:
freewalk()
.
%p
na výpis PTE a adries ako 64-bitové hexadecimálne číslo.Vysvetlite logický význam každej dátovej stránky, ktorú vypísala funkcia vmprint()
. Ku každej takej stránke tiež uveďte jej prístupové bity a ako súvisí s výstupom print_pgtbl()
z prvej úlohy. Pomôžte si obrázkom 3.4 z xv6 knižky. Tento obrázok ale nemusí presne reprezentovať proces, ktorého adresný priestor skúmame.
Odpovede zapíšte do príslušných súborov podľa testovacieho skriptu.
Po úspešnom dokončení úlohy nezabudnite vytvoriť commit!
Stránkovací hardvér architektúry RISC-V podporuje okrem 4096-bajtových stránok taktiež stránky s veľkosťou 2 MB. Väčšie stránky sa vo všeobecnosti označujú ako superstránky (superpages) a 2 MB stránky označujeme ako megastránky (lebo RISC-V podporuje viac veľkostí). Pre vytvorenie superstránky musí operačný systém splniť dve podmienky: bity PTE_V a PTE_R musia byť nastavené na jednotku v PTE na úrovni 1 a číslo fyzickej stránky musí ukazovať na stránku a adresou, ktorá je násobkom dvoch megabajtov. Viac sa dočítate v manuáli privilegovaných inštrukcií, ak vyhľadáte reťazce megapage a superpage, obzvlášť na vrchu strany 112.
Použitie superstránok znižuje spotrebu fyzických stránok na tabuľky stránok a znižuje počet neúspešných prístupov do TLB kešky. Pre niektoré programy to môže výrazne zvýšiť ich výkon.
sbrk()
s veľkosťou väčšou alebo rovnou 2 MB,Úlohu ste úspešne vyriešili, ak prejdete testovacím prípadom superpg_test programu pgtbltest.
Pomôcky:
superpg_test()
v súbore user/pgtbltest.c.sys_sbrk()
v súbore kernel/sysproc.c, ktorá je zavolaná zo systémového volania sbrk. Sledujte postupnosť programovaného kódu až do funkcie, ktorá alokuje pamäť pre sbrk.superalloc()
a superfree()
, ktoré budú vykonávať alokáciu a uvoľňovanie týchto blokov. Bude vám stačiť iba niekoľko dvojmegabajtových oblastí.uvmcopy()
a uvmunmap()
.Skutočné operačné systémy dynamicky konvertujú množinu bežných stránok na superstránku. Tento zdroj vysvetľuje, prečo je to dobrý nápad a čo je ťažké na zložitejšom návrhu:: Juan Navarro, Sitaram Iyer, Peter Druschel, and Alan Cox. Practical, transparent operating system support for superpages. SIGOPS Oper. Syst. Rev., 36(SI):89-104, December 2002.
Po úspešnom dokončení úlohy nezabudnite vytvoriť commit!
Týmto je cvičenie hotové. Skontrolujte, či vaše riešenie prejde všetkými testami make grade. Aby ste prešli posledným testom time, musíte vytvoriť nový súbor time.txt, v ktorom uvediete počet hodín, ktorý ste strávili nad zadaním ako celé číslo. Na záver nezabudnite aj túto zmenu commitnúť do repozitára.
Odpovede na otázky napíšte do súboru answers-pgtbl.txt. Nekontrolujeme ich, slúžia pre vás na pochopenie a opakovanie preberanej látky. Súbor commitnite do repozitára.
make grade môže zlyhať aj v prípade, že testy osamote zbehnú v poriadku. Je to spôsobené časovým limitom testov. Môžete ho zvýšiť v príslušnom súbore grade-lab-pgtbl (parametre timeout
). Časový limit zmeňte iba v takom prípade, že viete, že samotný test zbehne v poriadku a nič iné v súbore neupravujte.
Pre úspešné testovanie je potrebné použiť aspoň 3 jadrá vo VirtualBoxe.
Prvý riešiteľ každej úlohy môže dostať bonusové body po kontrole riešenia. Informujte sa u prednášajúceho alebo cvičiaceho. Voliteľné úlohy môžete riešiť až po vyriešení všetkých úloh základnej časti cvičenia! Riešenia prijímame iba do konca piateho týždňa semestra.