LOADALL - LOADALL

LOADALL jest wspólną nazwą dla dwóch różnych, nieuregulowanym instrukcji maszynowych w Intel 80286 i Intel 80386 procesorów, które pozwalają na dostęp do obszarów wewnętrznego stanu procesora, które są zwykle poza IA-32 API zakresie, jak rejestry deskryptor podręcznej . LOADALL dla 286 procesorów ma kodowanie 0Fh 05h, a LOADALL dla 386 procesorów to 0Fh 07h.

Oba warianty - jak sama nazwa wskazuje - ładują wszystkie wewnętrzne rejestry procesora w jednej operacji. LOADALL miał wyjątkową zdolność ustawiania widocznej części rejestrów segmentowych (selektora) niezależnie od odpowiadającej im części w pamięci podręcznej, pozwalając programiście na wprowadzanie procesora w stany niedozwolone w innym przypadku w oficjalnym modelu programowania.

Stosowanie

Jako przykład użyteczności tych technik, LOADALL może ustawić procesor tak, aby umożliwiał dostęp do całej pamięci z trybu rzeczywistego , bez konieczności przełączania go w tryb nierealny (co wymaga przełączenia w tryb chroniony , uzyskania dostępu do pamięci i ostatecznie przełączenia z powrotem do trybu rzeczywistego) tryb). Programy takie jak wersje RAMDRIVE.SYS (1985), SMARTDRV.SYS (1986), a także sterowniki HIMEM.SYS (2.03, 1988-08-04; 2.04, 1988-08-17) w systemie MS-DOS przed XMS , Uniform Software Systems ' Extender (1985) oraz Connector (1985) dla Lotus 1-2-3 , Above Disk (1986) (a LIMulator przez Above Software (dawniej Tele-Ware Zachodzie aka Los Angeles Grupa Securities ), który przekształcany ciężko miejsce na dysku lub pamięć rozszerzona do pamięci rozszerzonej ), a systemy OS / 2 1.0 i 1.1 wykorzystywały instrukcję 286 LOADALL. DOS 3.3 i 4.0 zarezerwowały 102-bajtowy bufor o godzinie 0070: 0100 (który był normalnie zajęty przez dane systemu DOS BIOS ), więc nie było potrzeby zapisywania i przywracania go dla LOADALL. Specjalne przypadki EMM386.EXE firmy Microsoft, zarówno instrukcje 286, jak i 386 LOADALL w jego nieprawidłowej obsłudze kodu operacji. Badanie kodu monitora maszyny wirtualnej w systemie Windows / 386 2.10 pokazuje, że używa on zarówno wariantu 286, jak i jeszcze mniej znanego wariantu 386. Microsoft HIMEM.SYS w wersji 2.06 również używał LOADALL do szybkiego kopiowania do iz rozszerzonej pamięci w 286 systemach.

Innym ciekawym wykorzystanie LOADALL, określonymi w książce projektowania OS / 2 , byłoby umożliwienie prowadzenia dawne programy trybu rzeczywistego w 16-bitowym trybie chronionym, jak wykorzystywane przez Digital Research „s Concurrent DOS 286 od 1985 roku, jako 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” umożliwiłoby systemowi operacyjnemu przechwytywanie przeładowań rejestrów segmentów, a także próby wykonywania segmentów specyficznych dla trybu rzeczywistego arithmetic ”i emuluj żądane zachowanie, aktualizując deskryptory segmentów (ponownie LOADALL). Ten „wirtualny tryb 8086” dla 80286 był jednak zbyt wolny, aby był praktyczny. Pomysł miał być przede wszystkim odrzuca ponadto, ze względu na errata w niektórych wczesnych Intel 80286 procesorów przed E-2 krokami . W rezultacie OS / 2 1.x - a także Windows w trybie „standardowym” - musiały uruchamiać programy DOS w trybie rzeczywistym. Niemniej jednak pomysł nie zaginął; doprowadziło to Intela do wprowadzenia wirtualnego trybu 8086 w 80386, umożliwiającego wreszcie implementację " skrzynek DOS " w stosunkowo efektywny i udokumentowany sposób.

Ponieważ LOADALL nie przeprowadził żadnych kontroli poprawności danych załadowanych do rejestrów procesora, możliwe było załadowanie stanu procesora, którego normalnie nie można było wprowadzić, takiego jak użycie trybu rzeczywistego (PE = 0) razem ze stronicowaniem (PG = 1 ) na procesorach klasy 386.

Emulator na płytce (ICE) jest narzędziem służącym do niskiego poziomu debugowania. W przypadku Intel 80386 potwierdzenie nieudokumentowanego styku w lokalizacji B6 powoduje, że mikroprocesor zatrzymuje wykonywanie i przechodzi 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 i ta instrukcja jest używana przez kod ICE do powrotu do normalnego wykonywania.

W późniejszych procesorach przekształciło się 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 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 rolę odgrywały instrukcje RSM z innym kodowaniem.

Microsoft Codeview 3.0 i Borland's Turbo Debugger 2.0 poprawnie dekodują instrukcje 286 i 386 LOADALL.

Ponieważ dwie instrukcje LOADALL nigdy nie zostały udokumentowane i nie istnieją na późniejszych procesorach, kody operacyjne zostały ponownie użyte w architekturze AMD64 . Kod operacji dla instrukcji 286 LOADALL, 0F05, stał się instrukcją AMD64 SYSCALL; instrukcja 386 LOADALL, 0F07, stała się instrukcją SYSRET. Te definicje zostały wdrożone nawet w procesorach Intela wraz z wprowadzeniem implementacji Intel 64 AMD64.

80286

Kod operacji 0F05. Instrukcja odczytuje dane z adresów 00800–00866, niezależnie od zawartości rejestrów segmentowych.

Adres liczba
bajtów
zarejestrować zarejestrować zarejestrować zarejestrować
00800 6 nieużywany
00806 2 MSW, słowo statusu 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 docelowy) SI (indeks źródłowy) BP (wskaźnik podstawowy) 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żywana do przełączania z trybu chronionego z powrotem do trybu rzeczywistego (nie może wyczyścić bitu PE w MSW). Jednak użycie instrukcji LOADALL pozwala całkowicie uniknąć konieczności przełączania się w tryb chroniony.

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
zarejestrować zarejestrować zarejestrować zarejestrować
ES: EDI + 00 4 CR0, rejestr sterujący 0
ES: EDI + 04 4 EFLAGS
ES: EDI + 08 4 EIP, wskaźnik instrukcji
ES: EDI + 0C 4 × 4 EDI, indeks docelowy ESI, indeks źródłowy EBP, wskaźnik podstawowy 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 komina 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,
tablica deskryptorów lokalnych
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ż

Bibliografia

Dalsza lektura