x86 实模式如何在 RAM <640K 的机器上工作?

How did x86 real mode work on machines with <640K of RAM?

这个问题主要是出于历史兴趣,但我一直无法找到任何关于它的文档。我在 x86 实模式下可以找到的所有文档(包括 Intel 手册 [1] 和在线内存映射 [2])都假定系统内​​存为 640KiB。然而,最初的 IBM PC 只有 16KiB 或 64KiB 的 RAM [3]。

这是怎么做到的?两个具体问题:

  1. 如果访问了不存在的内存,CPU 会如何表现?英特尔手册 [1] 指出,对于实模式,某些指令触发了#GP(一般保护错误)"If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit",而对于其他指令,"If any part of the operand lies outside the effective address space from 0 to FFFFH." 这似乎并不意味着您可以获取#GP 以访问不存在的寻址良好的内存。那么 CPU 在这种情况下做了什么?
  2. 根据内存映射 [2],BIOS 通常将 MBR 加载到 0x7c00,这是原始 "cheap" IBM PC 的内存 space 之外,只有 16KiB 的 RAM。它是如何应对的? (BIOS 设计最初是否没有将代码加载到 0x7c00?)

[1] http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

[2]http://wiki.osdev.org/Memory_Map_(x86)

[3] http://en.wikipedia.org/wiki/IBM_Personal_Computer#PC

8088 处理器直接寻址 RAM,没有 MMU 或任何电路告诉处理器它正在访问无效地址。所以程序只是读取垃圾,通常是 0xff。之后不太可能持续很长时间:)

带有 16 KB RAM 的原始 IBM PC 在没有任何磁盘驱动器的情况下出售。所以引导地址无效并不重要。预计用户只会使用 ROM Basic。它不是很受欢迎。如果您购买的是带软盘的 "business use" 配置,那么您也会自动获得 64 KB RAM。所以地址是有效的。该配置以今天的价格计算为 7,795 美元:)

也注意到 this web page