Nierealny tryb

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