接下来讲解 PC 内存地址空间的演化历程,随后引入如何将 OS 代码从硬盘加载到内存中。

最初的 PC:1MB 内存

  1. 第一代 PC:
    • 处理器: 早期 PC 基于 16 位的 Intel 8088 处理器。
    • 内存限制: 这些计算机最多只能寻址 1MB 的物理内存。
    • 地址空间布局:
      • 0x00000000 - 0x0009FFFF (640KB): 用于常规随机存取内存 (RAM)。
      • 0x000A0000 - 0x000FFFFF (384KB): 保留区域,用于视频显示缓冲区和固件。

这是计算机系统中物理内存布局的一个简化图示,特别是针对于传统的 x86 架构。以下是该图示的中文注释和解释:

    +------------------+  <- 0x00100000 (1MB)
    |     BIOS ROM     |
    +------------------+  <- 0x000F0000 (960KB)
    |  16-bit devices, |
    |  expansion ROMs  |
    +------------------+  <- 0x000C0000 (768KB)
    |   VGA Display    |
    +------------------+  <- 0x000A0000 (640KB)
    |                  |
    |    Low Memory    |
    |                  |
    +------------------+  <- 0x00000000
  • 低内存区域 (0x00000000 - 0x000A0000,640KB): 这部分内存是最初的个人电脑兼容机中可用的主内存区域。它通常被操作系统和应用程序用于存储数据和代码。

  • VGA 显示内存 (0x000A0000 - 0x000C0000,128KB): 这块区域通常被用于视频图形阵列(VGA)的显示数据。它是用来存放图形数据的内存区域,使得视频卡可以访问并显示图像。

  • 16 位设备,扩展 ROM (0x000C0000 - 0x000F0000,192KB): 这部分内存用于存放各种 16 位设备的固件和扩展只读存储器(ROM)内容。这些设备可能包括早期的网络卡、视频卡等。

  • BIOS ROM (0x000F0000 - 0x00100000,64KB): 这是系统的基本输入输出系统(BIOS)存放的位置。BIOS 是在计算机启动时运行的第一个软件,它负责初始化和测试系统硬件,并从启动设备加载操作系统。

这个内存布局图展示了传统 x86 架构下的典型内存分布。由于历史原因和兼容性的需求,这种布局在很多现代计算机系统中仍然保持不变。了解这种布局对于操作系统的开发者和底层软件的开发者来说是非常重要的。

扩展内存与兼容性问题

  1. 突破 1MB 限制:

    • 处理器升级: 随着 80286 和 80386 处理器的出现,内存寻址能力分别提升到了 16MB 和 4GB。
    • 兼容性维护: 尽管内存寻址能力增强,为了保持与旧软件的兼容性,PC 架构师们保留了最低 1MB 的物理地址空间布局。
  2. 内存分割:

    • "低内存"与"扩展内存": 这导致物理内存从0x000A00000x00100000形成了一个"空洞",将 RAM 分为"低内存"(前 640KB)和"扩展内存"(其他部分)。

这个空洞的存在反映了 PC 计算机早期设计的遗留问题。在最初的 PC 设计中,只有 640KB 的内存是留给操作系统和应用程序的(称为基本内存),而更高地址的内存被用于其他目的(如视频显示和 BIOS)。随着时间的推移,尽管计算机的内存容量大大增加,这些约定为了保持与旧软件和硬件的兼容性而得以保留。

在现代计算机系统中,这个空洞区域通常不会被操作系统用于常规内存存储,因为它被特殊用途和兼容性需求占据了。不过,随着新技术和标准的发展,这个空洞的实际影响已经大大减少。

    +------------------+  <- 0xFFFFFFFF (4GB)
    |      32-bit      |
    |  memory mapped   |
    |     devices      |
    |                  |
    /\/\/\/\/\/\/\/\/\/\

    /\/\/\/\/\/\/\/\/\/\
    |                  |
    |      Unused      |
    |                  |
    +------------------+  <- depends on amount of RAM
    |                  |
    |                  |
    | Extended Memory  |
    |                  |
    |                  |
    +------------------+  <- 0x00100000 (1MB)
    |     BIOS ROM     |
    +------------------+  <- 0x000F0000 (960KB)
    |  16-bit devices, |
    |  expansion ROMs  |
    +------------------+  <- 0x000C0000 (768KB)
    |   VGA Display    |
    +------------------+  <- 0x000A0000 (640KB)
    |                  |
    |    Low Memory    |
    |                  |
    +------------------+  <- 0x00000000

这是对 32 位系统中的典型物理内存布局的描述。在 32 位系统中,物理地址空间被限制为 4GB。以下是对这些部分的作用的总结:

  1. 32-bit Memory Mapped Devices (0xFFFFFFFF - 约 depends on amount of RAM):

    • 这部分内存区域通常被用于内存映射的 I/O 设备。
    • 在 32 位系统中,硬件设备(如图形卡、网络适配器等)通过内存映射 I/O(MMIO)与操作系统进行交互。
    • 这些设备占据的地址通常位于物理内存的顶部(接近 4GB),这意味着这部分内存不能用于常规的 RAM 存储。
    • 由于这部分内存被用于设备映射,所以实际可用于操作系统和应用程序的物理内存可能小于 4GB。
  2. Unused Area (约 depends on amount of RAM - ?):

    • 这个区域通常是未被使用的,其具体大小取决于系统中安装的 RAM 数量和物理内存的映射方式。
    • 在某些系统中,当物理 RAM 少于 4GB 时,这个区域可能会很大。
  3. Extended Memory (低于 depends on amount of RAM):

    • 扩展内存指的是超过 1MB 之上的物理内存区域。
    • 在早期的计算机系统中,最初的 640KB 被称为基本内存,而超过这个范围的内存称为扩展内存。
    • 在现代计算机系统中,扩展内存通常指的是可用于操作系统和应用程序的主要内存区域。

这种内存布局体现了 32 位系统的物理地址空间限制和硬件设计的影响。随着 32 位架构逐渐被 64 位架构所取代,这种布局和限制在新的系统中不再适用。在 64 位系统中,物理地址空间被显著扩大,允许直接寻址更多的内存和设备。

现代 PC 和 32 位物理地址空间

  1. 32 位地址空间:
    • 地址空间拓展: 现代 PC 通常有 32 位物理地址空间,支持高达 4GB 的内存。
    • 顶部预留空间: 在 32 位物理地址空间的顶部,高于所有物理 RAM,通常由 BIOS 保留用于 32 位 PCI 设备。

超越 4GB 的内存和新挑战

  1. 超过 4GB 的物理 RAM:

    • 处理器升级: 最新的 x86 处理器支持超过 4GB 的物理 RAM。
    • 第二个"空洞": 在 32 位可寻址区域的顶部,BIOS 必须留出第二个"空洞",为这些 32 位设备映射留出空间。
  2. 地址空间复杂性:

    • OS 开发挑战: 处理复杂的物理地址空间和其他多年演化的硬件组织问题,成为操作系统开发的重要实际挑战之一。

这一系列演化展示了计算机硬件和软件如何相互影响,以及为了兼容性和性能所做的折衷。每一次技术突破和扩展都带来了新的设计挑战和解决方案。