Na tomto cvičení se seznámíte s jádrem miniaturního OS NOVA a implementujete do něj systémové volání brk
. NOVA je mikrohypervizor původně vyvíjený na TU Dresden, později ve firmě Intel a nyní převážně projektem GENODE. Na cvičeních však nebudete pracovat s kompletní verzí jádra NOVA, ale se zjednodušenou verzí pro výuku, která má pouze 2 tisíce řádek kódu.
Pro toto cvičení budete potřebovat následující:
libc6-dev-i386, qemu-system-i386
Ec::syscall_handler
Ptab::insert_mapping
(byla na přednáškách)
Kalloc
Implementujte systémové volání brk
s prototypem:
void *brk(void *address)
Toto systémové volání nastaví konec adresního prostoru procesu (tzv.
program break) na danou adresu (parametr address
). Tím se zvětší
nebo zmenší množství alokované paměti, které může program využívat ke
svému běhu. Program break je první adresa za koncem namapovaného
virtuálního adresního prostoru.
Vaše řešení by mělo splňovat následující požadavky:
address
. To znamená, že uživatelský program může používat paměť od adresy 0x1000 do address-1
. Přístup na stránky začínající na adrese vyšší či rovné address
nebude aplikaci dovolen.
brk
nesmí dojít k “pádu” systému.
Odevzdává se archiv se souborem ec_syscall.cc
obsahující vaši implementaci, ideálně vytvořený pomocí
make hw10
printf()
na potřebná místa v kódu. Pokud vám to nestačí můžete použít parametr -gdb
emulátoru Qemu, ale to je trochu komplikovanější.
Ec::root_invoke()
, která připravuje paměť pro spouštěný program. Funkce čte hlavičky z binárky aplikace, které si můžete zobrazit příkazem readelf –program-headers hello
.
readelf –sections hello
)
readelf –sections hello
)