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
- IBM Operating System / 2 Technical Reference - Programming Family (PDF) . 1 (1st ed.). IBM . Wrzesień 1987 [1986]. Zarchiwizowane (PDF) od oryginału w dniu 2017-01-03.
- Chappell, Geoff (styczeń 1994). Schulman, Andrew; Pedersen, Amorette (red.). DOS wewnętrzne . The Andrew Schulman Programming Series (druk 1, wyd. 1). Wydawnictwo Addison Wesley . s. 4, 21, 100–106, 127–129. ISBN 978-0-201-60835-9 . (strony xxvi + 738 + iv, dyskietka 3,5 cala [9] [10] ) Errata: [11] [12] [13]
- Chappell, Geoff (03.10.2008) [18.03.1997]. „Dziwne rzeczy LINK wie o procesorach 80x86” . Zarchiwizowane od oryginału w dniu 2019-04-21 . Źródło 2019-04-21 .
- Necasek, Michał (13.12.2014). „Ciekawe instrukcje” . Muzeum OS / 2 . Zarchiwizowane od oryginału w dniu 2019-04-21 . Źródło 2019-04-21 .
- Stiller, Andreas (1990). „Bitter für 32-Bitter”. c't - magazin für computertechnik (w języku niemieckim). Vol. 1990 nr. 8. p. 202.
- Juffa, Norbert; Siering, Peter (1990). „Wege über die Mauer. Loadall - Extended Memory im Real Mode des 80286”. c't - magazin für computertechnik (w języku niemieckim). Vol. 1990 nr. 11. s. 362–366.