Nierealny tryb
Część serii o trybach |
mikroprocesorowych dla architektury x86 |
---|
|
Pierwsza obsługiwana platforma pokazana w nawiasach |
W obliczeniach x86 tryb nierzeczywisty , także duży tryb rzeczywisty , ogromny tryb rzeczywisty , płaski tryb rzeczywisty lub tryb voodoo to wariant trybu rzeczywistego , w którym jeden lub więcej deskryptorów segmentu zostało załadowanych niestandardowymi wartościami, takimi jak 32-bitowe limity umożliwiające dostęp do całej pamięci. Wbrew nazwie nie jest to odrębny tryb adresowania, w którym mogą działać procesory x86. Jest używany w 80286 i nowszych.
Przegląd
Ze względu na wydajność procesory 80286 i wszystkie późniejsze procesory x86 używają adresu podstawowego, rozmiaru i innych atrybutów przechowywanych w wewnętrznej pamięci podręcznej deskryptora segmentu , ilekroć obliczają efektywne adresy pamięci, nawet w trybie rzeczywistym. Dlatego modyfikacja wewnętrznego deskryptora segmentu umożliwia zmianę niektórych właściwości segmentów w trybie rzeczywistym, takich jak rozmiar pamięci adresowalnej. Ta technika stała się szeroko stosowana i jest obsługiwana przez wszystkie procesory Intela.
HIMEM.SYS używa tej funkcji do adresowania pamięci rozszerzonej , chyba że DOS zostanie przełączony do pracy w wirtualnym trybie 8086 , który jest niekompatybilny z trybem nierzeczywistym.
Jedną z niewielu gier – jeśli nie jedyną – która korzystała z trybu nierzeczywistego, była Ultima VII .
Tryb nierzeczywisty jest używany przez kod BIOS , ponieważ jest to tryb początkowy nowoczesnych procesorów Intel. Co więcej, tryb zarządzania systemem (SMM) w procesorach Intel 386SL i nowszych umieszcza procesor w ogromnym trybie rzeczywistym.
Program w trybie nierzeczywistym może wywoływać 16-bitowy kod zaprogramowany do trybu rzeczywistego (BIOS, jądro DOS i sterowniki) bez żadnego przebijania . To sprawia, że sterownik trybu nierzeczywistego jest prostszy niż DPMI . Jednak tryb nierzeczywisty jest niezgodny z systemami operacyjnymi działającymi w trybie chronionym, takimi jak Windows 3.x/9x/NT i OS/2.
Tryb Big Real ma segment kodu 1 MiB i segment danych 4 GiB.
Niektóre programy ładujące (takie jak LILO ) używają trybu nierzeczywistego, aby uzyskać dostęp do 4 GiB pamięci.
Włączanie trybu nierzeczywistego
Aby przełączyć mikroprocesor 80386 lub nowszy w tryb nierzeczywisty, program musi najpierw wejść w tryb chroniony , znaleźć lub utworzyć płaski deskryptor w GDT lub LDT , załadować niektóre rejestry segmentów danych odpowiednim „selektorem” trybu chronionego, a następnie przełączyć powrót do trybu rzeczywistego. Po powrocie do trybu rzeczywistego procesor będzie nadal korzystał z deskryptorów zapisanych w pamięci podręcznej, jak ustalono w trybie chronionym, umożliwiając w ten sposób dostęp do 4 GiB rozszerzonej pamięci z trybu rzeczywistego.
Mikroprocesor 80286 można wprowadzić w tryb nierzeczywisty tylko za pomocą nieudokumentowanej instrukcji LOADALL , aby zmodyfikować rejestry bazowe ukrytego segmentu, aby wskazywały lokalizację pamięci źródłowej lub docelowej powyżej 1 MiB.
Począwszy od 80386, programy pracujące w trybie rzeczywistym mogą używać rejestrów 32-bitowych z prefiksem przesłonięcia rozmiaru adresu. Dzięki temu programy mogą używać adresu takiego jak DS:[EBX]. W normalnym trybie rzeczywistym błąd występuje, gdy EBX przekracza 0xFFFF. W trybie nierzeczywistym dostęp jest dozwolony.
Warianty trybu nierzeczywistego
Jak opisano powyżej, tryb nierzeczywisty zwykle obejmuje użycie jednego lub więcej selektorów danych w celu wydajniejszego adresowania danych w pamięci. Jest to powszechna praktyka i często określana jako „płaski tryb rzeczywisty” lub „duży tryb rzeczywisty”. „Ogromny tryb rzeczywisty” to wariant, w którym również segment kodu jest rozszerzony do 4 GiB.
Szczególny przypadek trybu nierzeczywistego uzyskuje się dodatkowo przez załadowanie selektora kodu (CS) z deskryptora mającego atrybut 32-bitowy (bit „D”) ustawiony na jeden. Ten rzadko używany wariant ma pewne zalety, głównie dlatego, że pozwala uniknąć prefiksów zastępowania rozmiaru operandu, zwykle wymaganych podczas używania adresowania 32-bitowego w 16-bitowym segmencie kodu, ale jest trudniejszy do skonfigurowania. Ponieważ przerwania w trybie rzeczywistym nie zachowują automatycznie wysokich szesnastu bitów wskaźnika rozszerzonej instrukcji (EIP), kod musi albo mieścić się w dolnej części segmentu kodu, albo być w stanie w jakiś sposób zachować i przywrócić wysokie bity EIP. Ponadto, jeśli mają zostać wywołane funkcje przerwań systemu BIOS lub DOS, które używają kodu 16-bitowego, wymagane jest przełączanie trybu, aby przełączać bit „D” tam iz powrotem. Niektóre emulatory nie obsługują emulacji programów działających w tym wariancie trybu nierzeczywistego.
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.
- Roden, Thomas (listopad – grudzień 1989). Napisane w Irvine, Kalifornia, USA. „Cztery gigabajty w trybie rzeczywistym - sprytna sztuczka, aby uzyskać dostęp do dużych przestrzeni pamięci w 80386 z DOS” . Dziennik programisty — dziennik zasobów dla programistów IBM PC . 386 Teraz. Tom. 7, nie. 6. Eugene, Oregon, USA: Oakley Publishing Company. s. 89–94. ISSN 0747-5861 . Zarchiwizowane od oryginału w dniu 2020-02-21 . Źródło 2020-02-21 .
- Williams, Al (lipiec 1990). „DOS + 386 = 4 gigabajty!” . Dziennik dr Dobba . Tom. 15. Ludowa firma komputerowa . s. 62–71. [1] [2] Errata: [3]
- Williams, Al (1991). „Rozdział 18: Dostęp do 4 gigabajtów w trybie rzeczywistym” . DOS 5: Przewodnik programisty - Podręcznik zaawansowanego programowania w systemie DOS (wyd. 1). Redwood City, Kalifornia, USA: M&T Publishing, Inc. / Prentice Hall International (UK) Limited . s. 691–712. ISBN 0-13-217993-8 . (Uwaga. Implementuje „duży tryb rzeczywisty” SEG4G.)
- Lespinasse, Michel. „Jak wyrzucić menedżera pamięci” . Amiens, Francja: Walken / Impact Studios. Zarchiwizowane od oryginału w dniu 03.01.2017 . Źródło 2015-10-21 .
- Podręcznik programisty Intel IA-32 — tom 3A
- Unabridged Pentium 4: genealogia procesora IA32 , Addison Wesley ISBN 0-321-24656-X . „Duży tryb rzeczywisty”
- „Wywołaj funkcję HugeRealMode Server „Włącz dwuetapowy model przerwań”” .
- Necaszek, Michał (2018-06-15). „Krótka historia trybu Unreal” . Muzeum OS/2 . Zarchiwizowane od oryginału w dniu 2018-09-15 . Źródło 2018-09-15 .
- „Rejestry pamięci podręcznej deskryptorów” .
- Chappell, Geoff (styczeń 1994). Schulman, Andrzej; Pedersen, Amorette (red.). Wewnętrzne DOS . Seria programistyczna Andrew Schulmana (pierwszy druk, wyd. 1). Wydawnictwo Addison Wesley . ISBN 978-0-201-60835-9 . (xxvi+738+iv stron, dyskietka 3,5" [4] [5] ) Errata: [6] [7] [8]
- https://patents.google.com/patent/US5642491 „Metoda rozszerzania zakresu pamięci adresowalnej w przetwarzaniu w trybie rzeczywistym w celu ułatwienia ładowania dużych programów do dużej pamięci”