Popis volání jádra vm86
Autor: Tomáš Koutný
Obsah
2. Vstup do virtuálního režimu
3. Opuštění virtuálního režimu
5. Vytvoření procesu pro virtuální režim - volání funkce jádra vm86()
Virtuální režim je jedním ze tří režimů, určených pro
spouštění a běh běžných aplikací, na i386+ kompatibilních procesorů, který byl
vytvořen pro potřeby aplikací chráněného režimu. Třetím je reálný režim, ve
kterém běží například MS DOS a aplikace pro něj napsané. Dnešní operační
systémy a jejich aplikace používají chráněný režim, ale občas je nutné spustit
aplikaci napsanou pro reálný režim. Protože aplikace reálného režimu nelze
spouštět jako aplikace chráněného režimu a přepínanání mezi těmito režimy by
bylo neefektivní, místo režimu reálného se použivá virtuální. Spuštěný proces
pak má stejné prostředí jako v reálném režimu, tj. stejné adresování. Ve
víceprocesových OS se ke spuštění těchto aplikací používá emulátor OS
reálného režimu, který běží ve virtuálním a k emulaci používá služby OS
běžícího v chráněném. Tento emulátor, např. DOSEMU, pak poskytuje služby
reálným aplikacím, které spustil. Aplikace virtuálního režimu však běží s
úrovní oprávnění 3, a pokud se pokusí provést akci požadující nižší úroveň,
je vyvolána vyjímka General Protection Fault.
Služby pro spouštění aplikací ve virtuálním režimu bývají
implementovány v jádře OS, v Linuxu vm86(plus).c, které zajišťuje obsluhu dále
popsaných stavů a vytváření procesů pro běh v něm.
2. Vstup do virtuálního režimu
Procesor může být přepnut do virtuálního režimu jedním z následujících způsobů:
Pokud je k přepnutí režimu použito přepnutí procesu, pak TSS musí být 32 bitový (pokud je 16 bitový, tj. chybí horní slovo registru EFLAGS, procesor vynuluje příznak VM). VM nastaví procesor podle TSS nového procesu. Tímto se nastaví způsob adresování: VM = 0 chráněný režim, VM = 1 reálný režim.
3. Opuštění virtuálního režimu
Procesor může opustit virtuální režim pouze pomocí přerušení nebo vyjímky. To může nastat v následujících situacích:
Jádro poskytuje služby procesu virtuálního režimu v podobě
obsluh přerušení a vyjímek.
Před voláním obsluhy se procesor nachází buď ve chráněném,
nebo ve virtuálním režimu. Ve chráněném se jedná pouze o nové nastavení
registrového páru CS:EIP. V opačném případě se musí vm86 rozhodnout, která z
možností popsaných v Opuštění virtuálního režimu nastala, a
podle toho zareagovat. V případě sw přerušení vyvolaného instrukcí INT n se
domnívá, že V86 proces požaduje některou ze služeb a provede se nastavení CS:EIP
podle LIDT(lokální tabulka popisovačů přerušení), tj. zavolá se rutina, která je
nainstalovaná na přerušení n. Vyjímku tvoří přerušení č. 3, která se
používá k ladicím účelům a nelze ji proto zpracovat tímto způsobem. Pokud nastala
vyjímka, je třeba zjistit do jaké kategorie patří a následně buď proces ukončit,
nebo v něm pokračovat.
V jádře se nalézá funkce int
vm86(struct vm86_struct *info)
, která umožňuje vstup do
virtuálního režimu podle informací ve struktuře info. Pokud uspěje, vrací
0. V opačném případě vrací -1. Jedná se o hw závislou funkci; más smysl jen pro
i386+ kompatibilní.
Deklarace vm86_struct
struct vm86_struct {
struct vm86_regs regs;
//registry procesu, tj. to co by uchovával 32 bitový TSS
unsigned long flags;
//přídavné informace o procesu
unsigned long screen_bitmap;
//pixely,
které proces zobrazuje
};
struct vm86_regs {
long ebx;
long ecx;
long edx;
long esi;
long edi;
long ebp;
long eax;
long __null_ds;
long __null_es;
long __null_fs;
long __null_gs;
long orig_eax;
long eip;
long cs;
long eflags;
long esp;
long ss;
long es;
long ds;
long fs;
long gs;
};
5. Vytvoření procesu pro virtuální režim - volání funkce jádra vm86()
K vytvoření procesu pro běh ve virtuálním režimu se používá
funkce jádra vm86, jejíž deklarace je popsána výše. Funkce je
přístupná jako syscall s číslem podfunkce 133, ve verzi vm86plus je číslo podfunkce
166. V dále uvedené implementaci používá funkci do_sys_vm86,
která k již vytvořenému procesu provede bezpečné nastavení registrů a způsobí
přepnutí na tento proces. Funkce má dva parametry: ukazatel na vm86_struct a
ukazatel na popisovač procesu. Dále se postará o přístup k paměti, kde je
uchováván obraz, který se zobrazuje na monitoru.
Z hlediska procesoru se jedná o vytvoření platného 32 bitového TSS
(tj. alokace paměti) identifikujícího proces virtuálního režimu. Proces má úroveň
oprávnění 3. Nakonec funkce provede přepnutí z chráněného režimu do virtuálního
instrukcí IRET s nastaveným příznakem NT. Protože při přepínání procesů se
režim rozlišuje podle TSS, zbývající kód vm86.c se uplatní jako obsluha vyjímek a
přerušení.
6. vm86.c
V této části je uveden zdrojový vm86.c s poznámkami podle předchozích údajů doplněných touto kurzívou. Odkazovaná stránka není ve formátu HTML 3.2.
Použité materiály:
Intel Architecture Software Developer's Manual, Volume 3:System Programming Guide
Michal Brandejs - Mikroprocesory INTEL
Linus Torvalds - vm86.c
materiály dostupné z http://www.x86.org
materiály dostupné z http://developer.intel.com