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 Drážďanské univerzitě, později ve firmě Intel a nyní firmami GENODE labs a Cyberus Technology. 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 datového segmentu v adresním
prostoru procesu (tzv. program break nebo jen break) na adresu
danou parametrem address
. Tím se zvětší nebo zmenší množství
alokované paměti, které může program využívat ke svému běhu. Break je
první adresa za koncem namapovaného datového segmentu.
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 o jedna menší než address
. Přístup na stránky začínající na adrese vyšší či rovné address
nebude programu dovolen.
address
rovno NULL (0), nejedná se o chybu a hodnota break se nemění. Toto volání slouží pouze ke zjištění aktuální hodnoty break.
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.
user/hello.c
můžete nabootovat buď na fyzickém počítači pomocí zavaděče podporujícího specifikaci multiboot (např. GRUB 2), ale pravděpodobně bude efektivnější ho pouštět jako virtuální stroj například v emulátoru Qemu. Pro to stačí spustit příkaz make run.
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
)