|Microprocessor modes for the x86 architecture|
|First supported platform shown in parentheses|
In x86 computing, unreal mode, also big real mode, huge real mode, or flat real mode, is a variant of real mode, in which one or more segment descriptors has been loaded with non-standard values, like 32-bit limits allowing to access entire memory. Contrary to its name, it is not a separate addressing mode that the x86 processors can operate in. It is used in the 80286 and later x86 processors.
For efficiency reasons, the 80286 and all later x86 processors use the base address, size and other attributes stored in their internal segment descriptor cache whenever computing effective memory addresses, even in real mode. Therefore a modification of the internal segment descriptor allows to alter some properties of segments in real mode, like the size of addressable memory. This technique became widely used and is supported by all Intel processors.
Unreal mode is still used by BIOS code as this is the initial mode of modern Intel processors. Furthermore, the System Management Mode (SMM) in Intel 386SL and later processors places the processor in unreal mode.
A program in unreal mode can call 16-bits code programmed for real mode (BIOS, DOS kernel and drivers) without any thunking. This makes an unreal mode driver simplier than a DPMI driver. However unreal mode is incompatible with protected mode operating systems such as Windows 3.x/9x/NT and OS/2.
Enabling unreal mode
To put an 80386 or higher microprocessor into unreal mode, a program must first enter protected mode, find or create a flat descriptor in the GDT or LDT, load some of the data segment registers with the respective protected mode "selector", and then switch back to real mode. After returning to real mode, the processor will continue using the cached descriptors as established in protected mode, thus allowing access to 4 GiB of extended memory from real mode.
The 80286 microprocessor can be put into unreal mode only with help of the undocumented instruction LOADALL to modify the hidden segment base registers to point to the source or target memory location above 1 MiB.
Starting with the 80386, real mode programs can use the 32 bit registers with the Address Size Override Prefix. This allows programs to use an address like DS:[EAX]. In normal real mode, a fault occurs if EAX exceeds 0xFFFF. In unreal mode, the access is allowed.
Variants of unreal mode
As described above, unreal mode usually involves using one or more data selectors to address data in memory more efficiently. This has been common practice and often referred to as "flat real mode" or "big real mode". The "huge real mode" is a variant where also the code segment is extended to 4 GiB.
A special case of unreal mode is attained by, in addition, loading the code selector (CS) from a descriptor having the 32-bit attribute ("D" bit) set to one. This rarely used variant presents some advantages, mainly because it allows to avoid the Operand Size Override Prefixes normally required when using 32-bit addressing in 16-bit code segment, but it is more difficult to set up. Since real mode interrupts do not automatically preserve the high sixteen bits of the extended instruction pointer (EIP), the code needs to either fit in the low portion of code segment or be able to preserve and restore the high bits of EIP in some way. In addition, if BIOS or DOS interrupt functions that use 16-bit code are to be called, mode switching is required to switch the "D" bit back and forth. Some emulators do not support emulation of programs running in this variant of unreal mode.
- Gutmann, Peter (2004) . Cryptographic Security Architecture: Design and Verification. Springer Science & Business Media. p. 58. ISBN 978-0-387-95387-8. Retrieved 2017-01-04.
[…] Unreal mode became so widely used […] that Intel was forced to support it in all later processors, although its presence was never documented […]
- Necasek, Michal (2011-03-18). "HIMEM.SYS, unreal mode, and LOADALL". OS/2 Museum. Archived from the original on 2017-01-03. Retrieved 2017-01-03.
- Riiser, Haakon. "HIMEM.SYS and unreal/flat real mode, EMM386 and UMBs". comp.os.msdos.programmer. Retrieved 2017-10-14.
- Pelner, Jenny; Pelner, James. "Minimal Intel Architecture Boot Loader". Retrieved 2017-10-14.
- Domas, Christopher (2015). "The Memory Sinkhole: An architectural privilege escalation vulnerability" (PDF). Battelle Memorial Institute. Archived (PDF) from the original on 2017-01-04. Retrieved 2017-01-04.
The processor loads an architecturally defined system state "Unreal" mode
- "Unreal Mode". Archived from the original on 2017-01-03. Retrieved 2015-02-18.
- "X86-64 Instruction Coding". Archived from the original on 2017-01-03. Retrieved 2015-02-18.
- "Flat Real Mode". 1998-03-16. Archived from the original on 2017-10-14.
- Brown, Ralph. "Interrupt List". INT 80 (AMI BIOS). Retrieved 2017-10-14.
- Brown, Ralph. "Interrupt List". INT 78 (HugeRealMode Driver). Retrieved 2017-10-14.
- Grysztar, Tomasz (2010-09-17). "unREAL Mode". Retrieved 2017-10-14.
- IBM Operating System/2 Technical Reference - Programming Family (PDF). 1 (1st ed.). IBM. September 1987 . Archived (PDF) from the original on 2017-01-03.
- Lespinasse, Michel. "How to kick out a memory manager". Amiens, France: Walken / Impact Studios. Archived from the original on 2017-01-03. Retrieved 2015-10-21.
- Intel IA-32 Software Developer's Manual - Volume 3A
- The Unabridged Pentium 4 IA32 Processor Genealogy, Addison Wesley ISBN 0-321-24656-X. "Big real mode"
- DOS+386=4GB!, Dr. Dobb's Journal, July 1990