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í
- Technická příručka k operačnímu systému IBM / 2 - Programovací rodina (PDF) . 1 (1. vyd.). IBM . Září 1987 [1986]. Archivováno (PDF) z originálu 3. 1. 2017.
- Chappell, Geoff (leden 1994). Schulman, Andrew; Pedersen, Amorette (eds.). Interní systémy DOS . Programovací řada Andrewa Schulmana (1. tisk, 1. vyd.). Nakladatelství Addison Wesley . 4, 21, 100–106, 127–129. ISBN 978-0-201-60835-9 . (xxvi + 738 + iv stránky, 3,5 "disketa [9] [10] ) Errata: [11] [12] [13]
- Chappell, Geoff (03.10.2008) [1997-03-18]. „Divné věci LINK ví o procesorech 80x86“ . Archivovány od originálu na 2019-04-21 . Citováno 2019-04-21 .
- Nečasek, Michal (13.12.2014). "Zvědavé pokyny" . Muzeum OS / 2 . Archivovány od originálu na 2019-04-21 . Citováno 2019-04-21 .
- Stiller, Andreas (1990). „Bitter für 32-Bitter“. c't - magazin für computertechnik (v němčině). Sv. 1990 č. 8. str. 202.
- Juffa, Norbert; Siering, Peter (1990). „Wege über die Mauer. Loadall - Extended Memory im Real Mode des 80286“. c't - magazin für computertechnik (v němčině). Sv. 1990 č. 11. str. 362–366.