ŁADUJ WSZYSTKO
LOADALL to wspólna nazwa dwóch różnych, nieudokumentowanych instrukcji maszynowych procesorów Intel 80286 i Intel 80386 , które umożliwiają dostęp do obszarów stanu wewnętrznego procesora, które zwykle znajdują się poza zakresem interfejsu API IA-32 , takich jak rejestry pamięci podręcznej deskryptorów . LOADALL dla procesorów 286 jest kodowany jako 0Fh 05h, podczas gdy LOADALL dla procesorów 386 to 0Fh 07h.
Oba warianty – jak sama nazwa wskazuje – ładują wszystkie wewnętrzne rejestry CPU w jednej operacji. LOADALL miał wyjątkową możliwość ustawienia widocznej części rejestrów segmentowych (selektora) niezależnie od odpowiadającej im części w pamięci podręcznej, umożliwiając programiście wprowadzenie procesora w stany, na które inaczej nie zezwala oficjalny model programowania.
Stosowanie
Jako przykład użyteczności tych technik, LOADALL może skonfigurować procesor tak, aby zezwalał na dostęp do całej pamięci z trybu rzeczywistego , bez konieczności przełączania go w tryb nierzeczywisty (co wymaga przełączenia w tryb chroniony , dostępu do pamięci i ostatecznie przełączenia z powrotem do trybu rzeczywistego tryb). Programy takie jak wcześniejsze wersje XMS RAMDRIVE.SYS (1985), SMARTDRV.SYS (1986) oraz HIMEM.SYS (2.03, 1988-08-04; 2.04, 1988-08-17) sterowniki w systemie MS-DOS , Uniform Software Systems 'The Extender (1985) i The Connector (1985) dla Lotus 1-2-3 , Above Disk (1986) ( LIMulator firmy Above Software (dawniej Tele-Ware West aka Los Angeles Securities Group), który konwertował miejsce na dysku twardym lub pamięć rozszerzoną na pamięć rozszerzoną ) oraz OS / 2 1.0 i 1.1 użył instrukcji 286 LOADALL. DOS 3.3 i 4.0 zarezerwowały 102-bajtowy bufor o godzinie 0070:0100h (który normalnie był zajęty przez DOS BIOS ), więc nie było potrzeby zapisywania i przywracania go dla LOADALL. Microsoft EMM386.EXE uwzględnia w specjalnych przypadkach zarówno instrukcje 286, jak i 386 LOADALL w swojej procedurze obsługi nieprawidłowego kodu operacji . Badanie kodu monitora maszyny wirtualnej w systemie Windows/386 2.10 pokazuje, że wykorzystuje on zarówno wariant 286 [ potrzebne źródło ] , jak i jeszcze mniej znany wariant 386 [ potrzebne źródło ] . Microsoft HIMEM.SYS w wersji 2.06 również używał LOADALL do szybkiego kopiowania do iz rozszerzonej pamięci w 286 systemach.
Innym interesującym zastosowaniem LOADALL, przedstawionym w książce The Design of OS/2 , byłoby umożliwienie uruchamiania programów w trybie rzeczywistym w 16-bitowym trybie chronionym, używanym przez Concurrent DOS 286 firmy Digital Research od 1985 r. a także FlexOS 286 i IBM 4680 OS od 1986 r. Oznaczenie wszystkich pamięci podręcznych deskryptorów w GDT i LDT jako „nieobecne” pozwoliłoby systemowi operacyjnemu na pułapkę przeładowania rejestru segmentów, a także próby wykonania „arytmetyki segmentów” specyficznej dla trybu rzeczywistego i emulacji pożądanego zachowania poprzez aktualizację deskryptorów segmentów (ponownie LOADALL). Ten „ tryb emulacji 8086 ” dla 80286 był jednak zbyt wolny, aby był praktyczny. Co więcej, pomysł musiał zostać w większości odrzucony z powodu błędów w niektórych wczesnych procesorach Intel 80286 przed stopniowaniem E- 2 . W rezultacie OS/2 1.x – a także Windows w trybie „standardowym” – musiał uruchamiać programy DOS w trybie rzeczywistym. Niemniej jednak pomysł nie został stracony; doprowadziło to Intela do wprowadzenia wirtualnego trybu 8086 80386, pozwalając na implementację „ skrzynek DOS ” w końcu w stosunkowo wydajny i udokumentowany sposób.
Ponieważ LOADALL nie sprawdzał poprawności danych ładowanych do rejestrów procesora, możliwe było załadowanie stanu procesora, którego normalnie nie można było wprowadzić, na przykład przy użyciu trybu rzeczywistego (PE=0) wraz ze stronicowaniem (PG=1 ) na procesorach klasy 386.
Emulator w obwodzie (ICE) to narzędzie używane do debugowania niskiego poziomu. W Intel 80386 potwierdzenie nieudokumentowanego pinu w lokalizacji B6 powoduje zatrzymanie wykonywania przez mikroprocesor i wejście w tryb ICE. Mikroprocesor zapisuje cały swój stan w obszarze pamięci odizolowanym od normalnej pamięci systemowej. Układ tego obszaru jest odpowiedni dla instrukcji LOADALL, która jest używana przez kod ICE do powrotu do normalnego wykonywania.
W późniejszych procesorach ewoluowało to w tryb zarządzania systemem (SMM). W SMM instrukcja RSM służy do ładowania pełnego stanu procesora z obszaru pamięci. Układ tego obszaru pamięci jest podobny do tego używanego przez instrukcję LOADALL. Instrukcja LOADALL w stylu 386 może być również wykonana na 486, ale tylko w trybie SMM. W późniejszych procesorach swoją rolę przejęła instrukcja RSM, z innym kodowaniem.
Codeview 3.0 firmy Microsoft i Turbo Debugger 2.0 firmy Borland poprawnie dekodują instrukcje LOADALL 286 i 386.
Ponieważ dwie instrukcje LOADALL nigdy nie zostały udokumentowane i nie istnieją w późniejszych procesorach, kody operacyjne zostały ponownie wykorzystane w architekturze AMD64 . Kod operacji dla instrukcji 286 LOADALL, 0F05, stał się instrukcją AMD64 SYSCALL; instrukcja 386 LOADALL, 0F07, stała się instrukcją SYSRET. Definicje te zostały zaimplementowane nawet w procesorach Intela wraz z wprowadzeniem implementacji AMD64 Intel 64 .
80286
Kod operacji 0F05. Instrukcja odczytuje dane z adresów 0x00800–0x00866, niezależnie od zawartości rejestrów segmentowych.
Adres |
liczba bajtów |
rejestr | rejestr | rejestr | rejestr |
---|---|---|---|---|---|
00800 | 6 | nieużywany | |||
00806 | 2 | MSW, słowo stanu maszyny | |||
00808 | 14 | nieużywany | |||
00816 | 2 | TR (rejestr zadań) | |||
00818 | 2 | flagi | |||
0081A | 2 | IP (wskaźnik instrukcji) | |||
0081C | 2 |
LDTR, lokalny rejestr tablicy deskryptorów |
|||
0081E | 4×2 | DS ( segment danych ) | SS (segment stosu) | CS (segment kodu) | ES (dodatkowy segment) |
00826 | 4×2 | DI (indeks miejsca docelowego) | SI (indeks źródłowy) | BP (wskaźnik bazowy) | SP (wskaźnik stosu) |
0082E | 4×2 | BX | DX | CX | TOPÓR |
00836 | 4×6 | Deskryptor segmentu ES | Deskryptor segmentu CS | Deskryptor segmentu SS | Deskryptor segmentu DS |
0084E | 4×6 |
GDT, globalna tablica deskryptorów |
LDT, lokalna tablica deskryptorów |
IDT, tablica deskryptorów przerwań |
TSS, segment stanu zadania |
Instrukcja 80286 LOADALL nie może być użyta do przełączenia z trybu chronionego z powrotem do trybu rzeczywistego (nie może wyczyścić bitu PE w MSW). Jednak użycie instrukcji LOADALL może całkowicie uniknąć konieczności przełączania do trybu chronionego.
80386
Kod operacji 0F07. Instrukcja ładuje dane z adresu ES:EDI. W rzeczywistości używa ES, a nie deskryptora ES.
Adres |
liczba bajtów |
rejestr | rejestr | rejestr | rejestr |
---|---|---|---|---|---|
ES:EDI+00 | 4 | CR0, rejestr kontrolny 0 | |||
ES:EDI+04 | 4 | EFLAGI | |||
ES:EDI+08 | 4 | EIP, wskaźnik instrukcji | |||
ES:EDI+0C | 4×4 | EDI, indeks miejsca docelowego | ESI, indeks źródłowy | EBP, wskaźnik bazowy | ESP, wskaźnik stosu |
ES:EDI+1C | 4×4 | EBX | EDX | ECX | EAX |
ES:EDI+2C | 2×4 | DR6 | DR7 | ||
ES:EDI+34 | 4 | TR, selektor stanu zadania | |||
ES:EDI+38 | 4 |
LDTR, lokalna tablica deskryptorów |
|||
ES:EDI+3C | 4×2 | GS, dodatkowy segment | nieużywany | FS, dodatkowy segment | nieużywany |
ES:EDI+44 | 4×2 | DS, segment danych | nieużywany | SS, segment stosu | nieużywany |
ES:EDI+4C | 4×2 | CS, segment kodu | nieużywany | ES, dodatkowy segment | nieużywany |
ES:EDI+54 | 4×12 |
Deskryptor TSS, selektor stanu zadania |
Deskryptor IDT, tablica deskryptorów przerwań |
Deskryptor GDT, globalna tablica deskryptorów |
Deskryptor LDT, lokalna tablica deskryptorów |
ES:EDI+84 | 4×12 | Deskryptor segmentu GS | Deskryptor segmentu FS | Deskryptor segmentu DS | Deskryptor segmentu SS |
ES:EDI+B4 | 2×12 | Deskryptor segmentu CS | Deskryptor segmentu ES |
Zobacz też
Dalsza lektura
- IBM Operating System/2 Informacje techniczne — rodzina programistów (PDF) . Tom. 1 (wyd. 1). IBM . wrzesień 1987 [1986]. Zarchiwizowane (PDF) od oryginału w dniu 03.01.2017 r.
- Chappell, Geoff (styczeń 1994). Schulman, Andrzej; Pedersen, Amorette (red.). Wewnętrzne elementy DOS . Seria programistyczna Andrew Schulmana (pierwszy druk, wyd. 1). Wydawnictwo Addison Wesley . s. 4, 21, 100–106, 127–129. ISBN 978-0-201-60835-9 . (xxvi+738+iv stron, dyskietka 3,5" [9] [10] ) Errata: [11] [12] [13]
- Chappell, Geoff (2008-10-03) [1997-03-18]. „Dziwne rzeczy LINK wie o procesorach 80x86” . Zarchiwizowane od oryginału w dniu 2019-04-21 . Źródło 2019-04-21 .
- Necasek, Michał (2014-12-13). „Ciekawe instrukcje” . Muzeum OS/2 . Zarchiwizowane od oryginału w dniu 2019-04-21 . Źródło 2019-04-21 .
- Stiller, Andreas (1990). „Gorzkie dla 32-gorzkie”. c't - magazin für computertechnik (w języku niemieckim). Tom. 1990, nr. 8. str. 202.
- Juffa, Norbert; Siering, Piotr (1990). "Wege über die Mauer. Loadall - Extended Memory im Real Mode des 80286". c't - magazin für computertechnik (w języku niemieckim). Tom. 1990, nr. 11. s. 362–366.