Popis volání jádra vm86

Autor: Tomáš Koutný

 

Obsah

1. Virtuální režim

2. Vstup do virtuálního režimu

3. Opuštění virtuálního režimu

4. Volání služeb OS z V86

5. Vytvoření procesu pro virtuální režim - volání funkce jádra vm86()

6. vm86.c


1. Virtuální režim

    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:

 

4. Volání služeb OS z V86

    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