Ł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