分段地址转换
过程
将逻辑地址转为线性地址,处理器会执行以下操作:
- 使用段选择符定位到GDT或LDT表中的段描述符。(仅当一个新的段选择符加载到段寄存器中才需要这一步)
- 先根据相应描述符表寄存器中的段地址(确定描述符表的地址)和段界限(确定描述符表的大小),根据段选择符的TI决定从哪种描述符表中取,再根据段选择符的索引找到相应段描述符的位置,比较RPL与DPL,若该段无问题,就取出相应的段描述符放入段描述符高速缓冲寄存器中。
- 从段描述符中取得32 位段基地址加到32位偏移量上,形成线性地址。
描述符
64位
包含段基地址,大小,段类型等信息。
段描述符是处理器用来把逻辑地址映射为线性地址的必要数据结构。描述符是由编译器、连接器、加载器、或者是操作系统生成的,不能由应用程序员生成。图5-3显示了两种常用的描述符的格式。所有的段描述符都是这两种格式当中的一种。段描述符的字段是以下:
基址(BASE****):决定了一个段在4G线性地址空间中的位置。处理器把3部分基址联接在一起,来形成一个32位的基址。
界限(LIMIT****):决定了一个段的大小。处理器用2部分的界限字段来形成一个20位的界限值。处理器以两种方式来解析界限的值,解析方式取决于粒度位的设置情况:
1、 当单元大小为一个字节时,则定义了一个最大为1M字节的段。
2、 如果单元大小为4K字节,则段大小可以高达4G。界限值在使用之前处理器将会把它先左移12位,低12位则自动插入0。
粒度位(Granularity bit****):决定了界限值被处理器解析的方式。当它被复位时,界限值被解析为以1字节为一个单元。当它置位时,则界限值以4K为一个单元。
类型(TYPE****):用于区别不同类型的描述符。
描述符特权级(Descriptor Privilege Level)(DPL):用来实现保护机制(参看第六章)。
段存在位(Segment-Present bit****):如果这一位为0,则此描述符为非法的,不能被用来实现地址转换。如果一个非法描述符被加载进一个段寄存器,处理器会立即产生异常。图5-4显示了当存在位为0时,描述符的格式。操作系统可以任意的使用被标识为可用(AVAILABLE)的位。一个实现基于段的虚拟内存的操作系统可以在以下情况下来清除存在位:
1、 当这个段的线性地址空间并没有完全被分页系统映射到物理地址空间时。
2、 当段根本没有在内存里时。
已访问位(Accessed bit****):当处理器访问该段时,将自动设置访问位。也就是说,当一个指向该段描述符的选择子被加载进一个段寄存器时或者当被一条选择子测试指令使用时。在段级基础上实现虚拟内存的操作系统可能会周期性的测试和清除该位,从而监视一个段的使用情况。
创建和维拟描述符是系统软件的任务,一般说来可能是由,编译器、程序加载器、系统生成器、或者操作系统来协作完成的。
描述符表(DT)
段描述符存储在以下两种描述符表中的一个:
- 全局描述符表GDT
- 局部描述符表LDT
本质是一个包含了很多描述符的8字节内存数组,长度可变,最多包含8192(2^13)个描述符
如何定位:通过GDTR和LDTR来定位内存中的全局描述符表和当前的局部描述符表。
这些寄存器存储了这些表的线性地址的基址和段长界限。指令LGDT和SGDT是用业访问全局描述符表寄存器的,而指令LLDT和SLDT则是用来访问局部描述符表寄存器的。
选择子(段选择符)
用于定位段描述符
在段寄存器内存放,段选择符(16位)+偏移量(32位)=逻辑地址
16位
线性地址部分的选择子是用来选择哪个描述符表和在该表中索引一个描述符的。
段选择符的3个字段分别是:
请求特权级RPL(Requested Privilege Level)
表指示标志TI(Table Index)
索引值(Index)
索引字段给出了描述符在GDT或LDT表中的索引项号
表索引字段TI用来选择描述符表。
TI=0表示描述符在GDT中;TI=1表示描述符在LDT中
请求特权级字段RPL提供了段保护信息