So the 64KiB limit is no longer valid and 32-bit offsets can be used in Real Mode to actually access areas above 64KiB ( segment * 16 + 32-bit offset). After the switch back to real mode, these values are not modified, regardless of what value is in the 16-bit segment register. When (in protected mode) a segment register is loaded with a "selector", a "segment descriptor cache register" is filled with the descriptor's values, including the size (or limit). That's why in the following code 0x08 = 1000b gets you entry #1 (entry #0 is ALWAYS a null descriptor). In protected mode, bits 3-15 in the segment registers represent an index into the global descriptor table. ![]() To do this, you need to set the descriptor cache's limits for your segment register(s) to any value higher than 64KiB (usually a full 4GiB ( 0xffffffff)). ![]() You still will not have full access to all physical RAM if you do not have the A20 Line enabled all the "odd" 1 MiB blocks will be unavailable. ![]() You're trying to load something that will run in 32-bit mode which is larger than 640K (therefore you cannot load it in conventional memory) and you don't want to bother writing a protected mode disk driver yet, but you also want to avoid switching between real and protected mode to copy chunks from the conventional memory buffer into extended memory.You're trying to extend a legacy 16-bit DOS program so that it can deal with larger data and neither Virtual 8086 Mode, nor xms are suitable for your needs. ![]() Unreal mode is usually recommended in the two following cases:
0 Comments
Leave a Reply. |