Na tomto cvičení pridáte do súborového systému xv6 podporu veľkých súborov a symbolických odkazov.
Predtým, než sa pustíte do písania kódu, prečítajte si kapitolu 7 File system z xv6 knižky a preštudujte si príslušný kód.
Vo svojom repozitári sa prepnite do vetvy util:
1 2 |
$ git fetch $ git checkout fs |
V prvej časti cvičenia zvýšite maximálnu podporovanú veľkosť súboru v xv6. Veľkosť súborov v xv6 je aktuálne obmedzená na 268 blokov, teda 268*BSIZE bajtov (BSIZE je v xv6 definovaný na 1024). Tento limit je spôsobený tým, že inode v xv6 obsahuje 12 priamych blokových čísel a jedno nepriame blokové číslo, ktoré odkazuje na blok, ktorý obsahuje ďalších 256 blokových čísel, čo je spolu 12+256=268 blokov.
Program bigfile vytvára najväčšie možné súbory, a oznámi ich veľkosť:
1 2 3 4 5 |
$ bigfile .. wrote 268 blocks bigfile: file is too small $ |
Test zlyhá, pretože najväčší súbor má iba 268 blokov.
Súborový systém musíte zmeniť tak, aby podporoval dvojito nepriame bloky v každom inode, pričom každý bude obsahovať 256 adries nepriamych blokov, a tie budú obsahovať 256 adries dátových blokov. Celkovo teda bude možné ukladať súbory o veľkosti až 256*256+256+11 blokov (11 namiesto 12, lebo jeden blok sme obetovali na priame čísla blokov dvojito nepriameho bloku).
mkfs inicializuje súborový systém, aby mal menej ako 2 000 voľných dátových blokov, čo je príliš nízky počet, aby ste mohli otestovať zmeny z tohoto cvičenia. Preto musíte zvýšiť túto hodnotu z 2 000 na 200 000 v súbore kernel/param.h:
1 |
#define FSSIZE 200000 // size of file system in blocks |
Obnovte mkfs, aby vytvoril väčší disk:
$ rm mkfs/mkfs fs.img; make mkfs/mkfs
Formát diskového inodu je definovaný v struct dinode v súbore fs.h. Najviac vás budú zaujímať položky NDIRECT, NINDIRECT, MAXFILE, a addrs[] štruktúry struct dinode. Pozrite si tiež obrázok 7.3 z xv6 knižky, v ktorom je zobrazený štandardný inode z xv6.
Kód, ktorý hľadá dáta súboru na disku je vo funkcii bmap() v fs.c. Prezrite si ju, aby ste pochopili, čo robí. bmap() je volaná pri čítaní aj zápise do súboru. Počas zápisu bmap() alokuje dostatočný počet nových blokov podľa potreby, aby sa do nich zmestil obsah súboru a zároveň alokuje nepriamy blok, ak je potrebný na uloženie adries blokov.
bmap() pracuje s dvoma druhmi čísel blokov. Argument bn je „logické číslo bloku“ — číslo bloku v súbore relatívne k začiatku súboru. Čísla blokov v ip->addrs[] a argument bread() sú čísla blokov na disku. Funkcia bmap() teda mapuje logické čísla blokov súborov na čísla blokov na disku.
1 2 3 4 5 6 7 8 |
$ bigfile .................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. wrote 65803 blocks done; ok $ usertests ... ALL TESTS PASSED $ |
bigfile je časovo náročný test, vyhraďte si minimálne minútu a pol na jeho zbehnutie.
Pomôcky:
Voliteľná výzva: pridajte podporu pre trojito nepriame bloky.
V druhej časti cvičenia pridáte do xv6 podporu symbolických odkazov. Symbolické odkazy (známe aj ako mäkké odkazy) odkazujú na súbor jeho cestou; keď otvoríte symbolický odkaz, jadro vás nasmeruje na odkazovaný súbor. Symbolické odkazu sú veľmi podobné pevným odkazom. Rozdiel spočíva v tom, že pevné odkazy môžu ukazovať len na súbor, ktorý sa nachádza na tom istom disku (ukazujú na konkrétny inode), zatiaľ čo symbolické odkazy môžu ukazovať na iné diskové zariadenie. Aj keď xv6 nepodporuje viaceré zariadenia, implementácia tohoto systémového volania vám dovolí lepšie pochopiť ako funguje vyhľadávanie cesty.
Implementujte nové systémové volanie symlink(char *target, char *path), ktoré vytvorí nový symbolický odkaz na path, ktorý bude ukazovať na súbor target. Pre viac informácií si pozrite manuálovú stránku funkcie symlink. Na otestovanie pridajte do Makefile program symlinktest a spustite ho. Implementáciu máte korektnú, ak majú testy takýto výstup (vrátane úspešných usertestov:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ symlinktest START: test symlinks Creating a Linking b -> a Writing to a Reading from b Removing a Linking a -> b Attempting to open b (cycle) Symlinking c to nonexistent file Creating symlink chain 1->2->3->4 SUCCESS: test symlinks $ usertests ... ALL TESTS PASSED $ |
Pomôcky:
Týmto je cvičenie hotové. Zmeny môžete commitnúť do repozitára.
Ďakujeme vyučujúcim predmetu CSEP551 (Jeseň 2019) na Univerzite vo Washingtone za cvičenie so symbolickým odkazom.