地址空间

分段机制涉及5个关键内容:逻辑地址(Logical Address,应用程序员看到的地址,在操作系统原理上称为虚拟地址,以后提到虚拟地址就是指逻辑地址)、物理地址(Physical Address, 实际的物理内存地址)、段描述符表(包含多个段描述符的“数组”)、段描述符(描述段的属性,及段描述符表这个“数组”中的“数组元素”)、段选择子(即段寄存器中的值,用于定位段描述符表中段描述符表项的索引)

(1) 逻辑地址空间
从应用程序的角度看,逻辑地址空间就是应用程序员编程所用到的地址空间,比如下面的程序片段:
int val=100;
int * point=&val;

其中指针变量point中存储的即是一个逻辑地址。在基于80386的计算机系统中,逻辑地址有一个16位的段寄存器(也称段选择子,段选择子)和一个32位的偏移量构成。

(2) 物理地址空间
从操作系统的角度看,CPU、内存硬件(通常说的“内存条”)和各种外设是它主要管理的硬件资源而内存硬件和外设分布在物理地址空间中。物理地址空间就是一个“大数组”,CPU通过索引(物理地址)来访问这个“大数组”中的内容。物理地址是指CPU提交到内存总线上用于访问计算机内存和外设的最终地址。

物理地址空间的大小取决于CPU实现的物理地址位数,在基于80386的计算机系统中,CPU的物理地址空间为4GB,如果计算机系统实际上有1GB物理内存(即我们通常说的内存条),而其他硬件设备的IO寄存器映射到起始物理地址为3GB的256MB大小的地址空间,则该计算机系统的物理地址空间如下所示:

  1. +------------------+ <- 0xFFFFFFFF (4GB)
  2. | 无效空间 |
  3. | |
  4. +------------------+ <- addr:3G+256M
  5. | 256MB |
  6. | IO外设地址空间 |
  7. | |
  8. +------------------+ <- 0xC0000000(3GB)
  9. | |
  10. /\/\/\/\/\/\/\/\/\/\
  11. /\/\/\/\/\/\/\/\/\/\
  12. | 无效空间 |
  13. +------------------+ <- 0x40000000(1GB)
  14. | |
  15. | 实际有效内存 |
  16. | |
  17. +------------------+ <- 0x00100000 (1MB)
  18. | BIOS ROM |
  19. +------------------+ <- 0x000F0000 (960KB)
  20. | 16-bit devices, |
  21. | expansion ROMs |
  22. +------------------+ <- 0x000C0000 (768KB)
  23. | VGA Display |
  24. +------------------+ <- 0x000A0000 (640KB)
  25. | |
  26. | Low Memory |
  27. | |
  28. +------------------+ <- 0x00000000

图6 X86计算机系统的物理地址空间

(3) 线性地址空间

一台计算机只有一个物理地址空间,但在操作系统的管理下,每个程序都认为自己独占整个计算机的物理地址空间。为了让多个程序能够有效地相互隔离和使用物理地址空间,引入线性地址空间(也称虚拟地址空间)的概念。线性地址空间的大小取决于CPU实现的线性地址位数,在基于80386的计算机系统中,CPU的线性地址空间为4GB。线性地址空间会被映射到某一部分或整个物理地址空间,并通过索引(线性地址)来访问其中的内容。线性地址又称虚拟地址,是进行逻辑地址转换后形成的地址索引,用于寻址线性地址空间。但CPU未启动分页机制时,线性地址等于物理地址;当CPU启动分页机制时,线性地址还需经过分页地址转换形成物理地址后,CPU才能访问内存硬件和外设。三种地址的关系如下所示:

  • 启动分段机制,未启动分页机制:逻辑地址—> (分段地址转换) —>线性地址==物理地址
  • 启动分段和分页机制:逻辑地址—> (分段地址转换) —>线性地址—>分页地址转换) —>物理地址

在操作系统的管理下,采用灵活的内存管理机制,在只有一个物理地址空间的情况下,可以存在多个线性地址空间。一个典型的线性地址空间