Tabulka přerušení deskriptoru - Interrupt descriptor table - Wikipedia
Tento článek obsahuje seznam obecných Reference, ale zůstává z velké části neověřený, protože postrádá dostatečné odpovídající vložené citace.září 2013) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
The Tabulka přerušení deskriptoru (IDT) je datová struktura používaná architektura x86 implementovat vektor přerušení stůl. IDT používá procesor k určení správné odpovědi na přerušení a výjimky.
Podrobnosti v popisu níže platí konkrétně pro architekturu x86 a AMD64 architektura. Jiné architektury mají podobné datové struktury, ale mohou se chovat odlišně.
Použití IDT je spouštěno třemi typy událostí: hardwarová přerušení, softwarová přerušení a výjimky procesoru, které jsou společně označovány jako přerušení. IDT se skládá z 256 vektory přerušení –Z prvních 32 (0–31 nebo 0x00–0x1F) je rezervováno pro výjimky procesoru.
Skutečný režim
V 8086 procesoru se tabulka přerušení nazývá IVT (vektor přerušení). IVT se vždy nachází na stejném místě v paměti, od 0x0000
na 0x03ff
a skládá se z 256 čtyřbajtů skutečný režim vzdálené ukazatele (256 × 4 = 1024 bajtů paměti).
Ukazatel reálného režimu je definován jako 16bitový segment a 16bitové posunutí do tohoto segmentu. Segment je interně rozšířen procesorem na 20 bitů posunutím o 4 bity doleva, čímž jsou omezeny obslužné rutiny přerušení v reálném režimu na první 1 megabajt paměti. Prvních 32 vektorů je vyhrazeno pro interní výjimky procesoru a hardwarová přerušení mohou být mapována na kterýkoli z vektorů prostřednictvím programovatelného řadiče přerušení.
Na 80286 a později lze velikost a umístění IVT změnit stejným způsobem, jako se to děje s IDT v chráněný režim (tj. prostřednictvím instrukce LIDT), ačkoli to nemění jeho formát. Model 80286 také představil oblast vysoké paměti, což zvyšuje limit adresy v reálném režimu o 65 520 bajtů.
Běžně používané přerušení x86 v reálném režimu je INT 10H
, Video BIOS kód pro zpracování primitivních funkcí kreslení obrazovky, jako je kreslení pixelů a změna rozlišení obrazovky.
Chráněný režim
v chráněný režim, IDT je pole deskriptorů uložených postupně v paměti a indexovaných vektorem přerušení. Plně obsazený IDT je 2 KB v 32bitovém chráněném režimu (256 záznamů po 8 bajtech) na délku a 4 KB v 64bitovém chráněném režimu (256 záznamů po 16 bajtech). Není nutné používat všechny možné položky: stačí naplnit IDT až do nejvyššího použitého vektoru přerušení a nastavit část IDT délky IDTR
podle toho.
Chráněný režim IDT může být umístěn kdekoli ve fyzické paměti. Procesor má speciální registr (IDTR
) pro uložení adresy fyzické adresy i délky IDT v bajtech. Když dojde k přerušení, procesor vynásobí vektor přerušení velikostí deskriptoru a přidá výsledek k základní adrese IDT. S pomocí délky IDT je poté ověřena výsledná adresa paměti, aby byla v tabulce; pokud je příliš velký, je vygenerována výjimka. Pokud je vše v pořádku, načte se deskriptor uložený na vypočítané paměťové místo a provedou se akce podle typu a obsahu deskriptoru.
Deskriptory mohou být buď brány přerušení, brány trapu, nebo, pouze pro 32bitový chráněný režim, brány úkolů. Brány přerušení a zachycení ukazují na místo v paměti obsahující kód, který se má provést zadáním obou segmentů (přítomných buď v GDT nebo LDT ) a offset v tomto segmentu. Jediným rozdílem mezi těmito dvěma je to, že brána přerušení znemožní další zpracování procesoru hardwarových přerušení, takže je obzvláště vhodná pro obsluhu hardwarových přerušení, zatímco trapová brána ponechá hardwarová přerušení povolená, a proto se používá hlavně pro zpracování softwarových přerušení a výjimek. Nakonec brána úlohy způsobí přepnutí aktuálně aktivního segmentu stavu úlohy pomocí mechanismu přepínání úloh hardwaru k efektivnímu předání použití procesoru jinému programu, vláknu nebo procesu.
Vektory 0–31 jsou rezervovány společností Intel pro výjimky generované procesorem (porucha obecné ochrany, chyba stránky, atd.). V současné době používají procesory Intel pouze vektory 0–20, zatímco procesory AMD používají vektory 0–19 a 29–30. Budoucí procesory však mohou vytvářet nekompatibilitu s nefunkčním softwarem, který tyto vektory používá pro jiné účely.
Hardwarově generované výjimky
Všechna INT_NUM mezi 0x0 a 0x1F včetně jsou vyhrazena pro výjimky; INT_NUM větší než 0x1F se používají pro přerušovací rutiny. (Všimněte si, že IBM PC ne vždy se řídil tímto pravidlem, například pomocí přerušení 5 k označení Tisk obrazovky bylo stisknuto tlačítko.)
INT_NUM | Stručný popis ODPOLEDNE[je zapotřebí objasnění ] |
---|---|
0x00 | Dělení nulou |
0x01 | Jednostupňové přerušení (viz vlajka pasti ) |
0x02 | NMI |
0x03 | Bod zlomu (lze vyvolat speciální 1bajtovou instrukcí 0xCC, kterou používají debuggery) |
0x04 | Přetékat |
0x05 | Meze |
0x06 | Neplatný operační kód |
0x07 | Koprocesor není k dispozici |
0x08 | Dvojitá chyba |
0x09 | Překročení segmentu koprocesoru (Pouze 386 nebo starší) |
0x0A | Neplatný segment stavu úkolu |
0x0B | Segment není přítomen |
0x0C | Chyba zásobníku |
0x0D | Porucha obecné ochrany |
0x0E | Chyba stránky |
0x0F | Rezervováno |
0x10 | Matematická chyba |
0x11 | Kontrola zarovnání |
0x12 | Kontrola stroje |
0x13 | SIMD Výjimka s plovoucí desetinnou čárkou |
0x14 | Výjimka virtualizace |
0x15 | Výjimka ochrany řízení |
Hákování
Nějaký Okna programy háček volání na IDT. To zahrnuje psaní režimu jádra Řidič který zachycuje volání IDT a přidává vlastní zpracování. Toto nikdy oficiálně nepodporovalo Microsoft, ale nebylo programově zabráněno na jeho operačních systémech až do 64-bit verze systému Windows, kde ovladač, který se pokusí použít a režim jádra hák způsobí, že stroj kontrola chyb.[1]
Reference
- ^ „Zásady oprav pro systémy založené na x64“.
Pokud operační systém zjistí jednu z těchto úprav nebo jinou neoprávněnou opravu, vygeneruje kontrolu chyby a vypne systém.
- Všeobecné
externí odkazy
- Příručka pro vývojáře softwaru Intel 64 a IA-32 Architectures, svazek 3A: Průvodce programováním systému, část 1 (viz KAPITOLA 5, MANIPULACE S PŘERUŠENÍM A VÝJIMKOU a KAPITOLA 10, POKROČILÝ PROGRAMOVATELNÝ REGULÁTOR PŘERUŠENÍ)]
- Tabulka přerušení deskriptoru na OSDev.org