Jonas Haglund

Timervirtualisering för hypervisors

Sammanfattning

En hypervisor installeras direkt på datorns hårdvara, och ovanpå hypervisorn installeras ett antal operativsystem, kallade gästsystem. Denna teknik erbjuder ett flertal möjligheter: effektivare användning av hårdvara; mindre hårdvara och mindre fysiskt utrymme behövs; och säkerhet i form av isolering.

För att denna teknik skall fungera krävs det att dels hypervisorn skall kunna utföra byten av operativsystem, men även gästoperativsystemen skall kunna byta sina applikationer. För att hypervisorn och gästoperativsystemen skall veta när ett byte skall ske används en timer.

Detta betyder att samma timer skall användas av flera användare samtidigt. Då hypervisors kan användas till flera nyttiga tillämpningar och beror på en timer är det intressant att undersöka hur en timerkomponent kan konstrueras för en hypervisor. Hypervisorn skall kunna använda timerkomponenten för att ge sig själv en timer men även för varje gästsystem. Detta illustreras med en generell design av en timerkomponent och genom en implementation på ARM-arkitekturen.

En designfråga som dök upp var hur gästsystemens timers skulle räkna ned: kontinuerligt eller endast när de exekverar? Det sistnämnda alternativet valdes på grund av att det antogs att operativsystem behöver en timer som visar hur lång tid de exekverat, speciellt i samband när applikationer skall bytas.

Då hypervisors kan användas i många olika tillämpningar är det även viktigt att undersöka vilken tidsfördröjning hypervisorn ger upphov till vid leverans av realtidsavbrott. Målet var att hypervisorn inte skulle exekvera fler än 100 instruktioner från det att timeravbrottet uppstod tills dess att det levererades till gästoperativsystemet.

Angående mängden instruktioner som exekverades under leveransen av avbrottet uppskattades dessa till cirka 40 stycken vilket resulterade i en tidsfördröjning på under 200 ns på en ARM9-processor på 300 MHz.

Det visades att räkna gästsystemens exekveringstid inte alltid är bra då avbrott endast levereras medan gästsystemen exekverar. Anledningen är att ibland önskas realtidsavbrott oavsett om gästsystemet exekverar eller ej. Med tanke på detta och att det finns många olika timers en dator kan behöva så är denna timerkomponent otillräcklig. Istället bör en timerkomponent erbjuda flera olika sätt att räkna tid för att vara så tillämpningsbar som möjligt.