4.2.1 内存寻找
内存寻址是指对存储在内存中的某个指定数据对象的地址进行定位。
4.2.2 地址变换
任何完整的内存管理系统都包含两个关键部分:保护和地址变换。
80x86在从逻辑地址到物理地址变换过程中使用了分段和分页两种机制。第一阶段使用分段机制把程序的逻辑地址变换成处理器可寻址内存空间(称为线性地址空间)中的地址。第二阶段使用分页机制把线性地址转换为物理地址。
1. 分段机制
逻辑地址包含一个段选择符和一个偏移量。
段选择符提供了段描述符表中一个数据结构(称为段描述符)的偏移量。
段描述符指明段的大小、访问权限和段的特权级、段类型以及段的第1字节在线性地址空间中的位置(称为段的基地址)。
逻辑地址的偏移量部分加到段的基地址上就可以定位段中某字节的位置。
2. 分页机制
当使用分页时,每个段被划分成页面(通常每页为4KB大小),页面会被存储于物理内存中或硬盘上。操作系统通过维护一个页目录和一些页表来留意这些页面。当程序(或任务)试图访问线性地址空间中的一个地址位置时,处理器就会使用页目录和页表把线性地址转换成一个物理地址,然后在该内存位置上执行所要求的操作。
4.2.3 保护
80x86支持两类保护。其一是通过给每个任务不同的虚拟地址(逻辑地址)空间来完全隔离各个任务。另一个保护机制对任务进行操作,以保护操作系统内存段和处理器特殊系统寄存器不被应用程序访问。
1. 任务之间的保护
把每个任务放置在不同的虚拟地址空间中,并给予每个任务不同的逻辑地址到物理地址的变换映射。在80x86中,每个任务都有自己的段表和页表。当处理器切换去执行一个新任务时,任务切换的关键部分就是切换到新任务的变换表。
2. 特权级保护
特权级用数字0~3表示,其中0具有最高特权级;而3则是最低特权级。每个内存段都与一个特权级相关联。
当前特权级(Current Privilege Level)即CPL就是当前活动代码段的特权级,并且它定义了当前所执行程序的特权级别。CPL定义了哪些段能够被程序访问。
在给定CPL级别上执行的程序允许访问同级别或低级别的数据段。任何对高级别段的引用都是非法的,并且会引发一个异常来通知操作系统。