LOADALL - LOADALL

Loadall je společný název pro dva různé, nehlášených strojových instrukcí pro Intel 80286 a Intel 80386 procesory, které umožňují přístup do oblastí státu vnitřního procesoru, které jsou za normálních okolností mimo IA-32 API rozsahu, jako deskriptor vyrovnávacích registrů . LOADALL pro 286 procesorů je kódován 0Fh 05h, zatímco LOADALL pro 386 procesorů je 0Fh 07h.

Obě varianty - jak název napovídá - načtou všechny vnitřní registry CPU v jedné operaci. LOADALL měl jedinečnou schopnost nastavit viditelnou část registrů segmentů (selektor) nezávisle na jejich odpovídající části v mezipaměti, což programátorovi umožnilo uvést CPU do stavů, které oficiální programovací model jinak neumožňuje.

Používání

Jako příklad užitečnosti těchto technik může LOADALL nastavit procesor tak, aby umožňoval přístup ke všem pamětem z reálného režimu , aniž by jej musel přepínat do nereálného režimu (což vyžaduje přepnutí do chráněného režimu , přístup k paměti a nakonec přepnutí zpět do reálného režim). Programy jako před XMS verze RAMDRIVE.SYS (1985), SMARTDRV.SYS (1986) a HIMEM.SYS (2.03, 1988-08-04; 2.04, 1988-08-17) ovladače v systému MS-DOS , Uniform Software Systems ' The Extender (1985) a The Connector (1985) for Lotus 1-2-3 , Above Disk (1986) (a LIMulator by Above Software ( former Tele-Ware West aka Los Angeles Securities Group ), který tvrdě konvertoval místo na disku nebo rozšířená paměť do rozšířené paměti ) a OS / 2 1.0 a 1.1 použily instrukci 286 LOADALL. DOS 3.3 a 4.0 rezervoval 102bajtovou vyrovnávací paměť v 0070: 0100h (která byla normálně obsazena daty systému DOS BIOS ), takže nebylo nutné ji ukládat a obnovovat pro LOADALL. Microsoft EMM386.EXE speciální případy 286 a 386 instrukce LOADALL v jeho neplatný obslužný program opcode. Zkoumání kódu monitoru virtuálního stroje ve Windows / 386 2.10 ukazuje, že používá jak 286, tak ještě méně známou variantu 386. Microsoft HIMEM.SYS verze 2.06 také použil LOADALL k rychlému kopírování do az rozšířené paměti na 286 systémech.

Dalším zajímavým využití Loadall, vyložil v knize návrhu OS / 2 , by bylo umožnit spuštění dřívější programy pro reálný režim v 16-bitovém chráněném režimu, jak je využívána Digital Research je souběžné DOS 286 od roku 1985, as stejně jako FlexOS 286 a IBM 4680 OS od roku 1986. Označení všech mezipamětí deskriptorů v GDT a LDT „not present“ by umožnilo operačnímu systému zachytit opětovné načtení segmentů a registrů, stejně jako pokusy o provedení segmentu specifického pro reálný režim aritmetika "a emulovat požadované chování aktualizací deskriptorů segmentů (opět LOADALL). Tento „virtuální režim 8086“ pro 80286 byl však příliš pomalý, než aby byl praktický. Myšlenka musela být většinou zavrhována, navíc kvůli chybám v některých časných procesorech Intel 80286 před krokováním E-2 . Výsledkem bylo, že OS / 2 1.x - a Windows také ve „standardním“ režimu - musely spouštět programy DOS v reálném režimu. Myšlenka však nebyla ztracena; to vedlo Intel k zavedení virtuálního režimu 8086 modelu 80386, který umožňuje implementaci „ DOS boxů “ konečně relativně efektivním a zdokumentovaným způsobem.

Protože program LOADALL neprováděl žádné kontroly platnosti dat načtených do registrů procesorů, bylo možné načíst stav procesoru, který nebylo možné normálně zadat, například použití reálného režimu (PE = 0) společně s stránkováním (PG = 1 ) na procesorech třídy 386.

Emulátor v obvodu (ICE) je nástroj použit pro nízké hladiny ladění. Na procesoru Intel 80386 uplatnění nezdokumentovaného kolíku v místě B6 způsobí, že mikroprocesor zastaví provádění a vstoupí do režimu ICE. Mikroprocesor ukládá celý svůj stav do oblasti paměti izolované od normální systémové paměti. Rozložení této oblasti je vhodné pro instrukci LOADALL a tuto instrukci používá kód ICE k návratu k normálnímu provedení.

V pozdějších procesorech se to vyvinulo do režimu správy systému (SMM). V SMM se instrukce RSM používá k načtení úplného stavu CPU z oblasti paměti. Rozložení této oblasti paměti je podobné tomu, které používá instrukce LOADALL. Instrukci LOADALL ve stylu 386 lze provést také na 486, ale pouze v režimu SMM. V pozdějších procesorech převzala svou roli instrukce RSM s odlišným kódováním.

Microsoft Codeview 3.0 a Borland's Turbo Debugger 2.0 správně dekódují 286 a 386 instrukce LOADALL.

Jelikož tyto dvě instrukce LOADALL nebyly nikdy zdokumentovány a na pozdějších procesorech neexistují, byly operační kódy znovu použity v architektuře AMD64 . Operačním kódem pro instrukci 286 LOADALL, 0F05, se stala instrukce AMD64 SYSCALL; instrukce 386 LOADALL, 0F07, se stala instrukcí SYSRET. Tyto definice byly implementovány dokonce i na procesorech Intel zavedením implementace Intel 64 pro AMD64.

80286

Opcode 0F05. Instrukce čte data z adres 00800–00866 bez ohledu na obsah segmentových registrů.

Adresa počet
bajtů
Registrovat Registrovat Registrovat Registrovat
00800 6 nepoužívá
00806 2 MSW, stavové slovo stroje
00808 14 nepoužívá
00816 2 TR (registr úkolů)
00818 2 vlajky
0081A 2 IP (instrukční ukazatel)
0081C 2 LDTR,
registr tabulky lokálního deskriptoru
0081E 4 × 2 DS (datový segment ) SS (segment zásobníku) CS (segment kódu) ES (extra segment)
00826 4 × 2 DI (cílový index) SI (zdrojový index) BP (základní ukazatel) SP (ukazatel zásobníku)
0082E 4 × 2 BX DX CX SEKERA
00836 4 × 6 Deskriptor segmentu ES Deskriptor segmentu CS Deskriptor segmentu SS Deskriptor segmentu DS
0084E 4 × 6 GDT,
tabulka globálních deskriptorů
LDT,
tabulka lokálního deskriptoru
IDT,
tabulka deskriptorů přerušení
TSS,
segment stavu úkolu

Instrukci 80286 LOADALL nelze použít k přepnutí z chráněného zpět do reálného režimu (nemůže vymazat bit PE v MSW). Použití instrukce LOADALL však může zabránit nutnosti úplně přepnout do chráněného režimu.

80386

Opcode 0F07. Instrukce načte data z adresy ES: EDI. Ve skutečnosti používá ES, ne deskriptor ES.

Adresa počet
bajtů
Registrovat Registrovat Registrovat Registrovat
ES: EDI + 00 4 CR0, řídicí registr 0
ES: EDI + 04 4 EFLAGS
ES: EDI + 08 4 EIP, ukazatel instrukce
ES: EDI + 0C 4 × 4 EDI, cílový index ESI, zdrojový index EBP, základní ukazatel ESP, ukazatel zásobníku
ES: EDI + 1C 4 × 4 EBX EDX ECX EAX
ES: EDI + 2C 2 × 4 DR6 DR7
ES: EDI + 34 4 TR, selektor stavu úkolu
ES: EDI + 38 4 LDTR,
tabulka lokálního deskriptoru
ES: EDI + 3C 4 × 2 GS, extra segment nepoužívá FS, extra segment nepoužívá
ES: EDI + 44 4 × 2 DS, datový segment nepoužívá SS, segment zásobníku nepoužívá
ES: EDI + 4C 4 × 2 CS, segment kódu nepoužívá ES, extra segment nepoužívá
ES: EDI + 54 4 × 12 Deskriptor TSS,
selektor stavu úkolu
Deskriptor IDT,
tabulka deskriptorů přerušení
Deskriptor GDT,
tabulka globálního deskriptoru
LDT deskriptor,
tabulka lokálního deskriptoru
ES: EDI + 84 4 × 12 Deskriptor segmentu GS Deskriptor segmentu FS Deskriptor segmentu DS Deskriptor segmentu SS
ES: EDI + B4 2 × 12 Deskriptor segmentu CS Deskriptor segmentu ES

Viz také

Reference

Další čtení