由虚拟地址转换为一个物理地址其实是先通过段机制将虚拟地址(逻辑地址)转换为线性地址。然后通过分页机制将线性地址转换为物理地址。如图:
今天先写写段机制
段是虚拟地址空间的基本单位,段机制必须把虚拟地址空间的一个地址转换为线性地址空间的一个线性地址。
1.段描述符
段描述符是一个数据结构其包括
段的基地址(Base Address):在线性地址空间中段的起始地址。
段的界限(Limit):在虚拟地址空间中,段内可以使用的最大偏移量。
段的保护属性(Attribute):表示段的特性。(该段是否可以被读出或写入,或该段是否作为一个程序来执行,以及段的特权等等)。
虚拟地址是段的偏移量。偏移量加基地址就是线性地址。
如图,虚拟地址空间中偏移量时从0到Limit范围内的一个段,而映射到线性地址空间就是从Base到Base+Limit。
将上图用一个表描述则可以理解如下
索引 基地址 界限 属性
0 BaseB LimitB AttributeB
1 BaseA LimitA AttributeA
2 BaseC LimitC AttributeC
这样的表就是段描述符表(段表),而其中的表项就是段描述符。
段描述符表是段描述符的一个数组。所谓的段描述符其实就是描述段的属性的一个8字节储存单元。具体储存感兴趣的大家可以上网自己查一下。
段选择符:
段选择符指向段描述符(索引)。因为索引表示段描述符在描述符表中位置,因此,把段寄存器也叫选择符。
TI:选择域,决定从全局描述符表(TI=0),还是从局部描述符表(TI=1)中选择相应的段描述符。
RPL:表示请求者的特权级。保护模式提供了0~3四个数字表示。但很多系统只包含其中的两个,即0表示最高级特权级,对应内核态;3表示最低特权级,对应用户态。
2.地址转换及保护
程序中的虚拟地址可以表示为“选择符:偏移量”这样的形式,通过以下步骤可以把一个虚拟地址转换为线性地址。
<1>在段寄存器中装入段选择符,同时把32位地址偏移量状如某个寄存器(如ESI,EDI)中。
<2>根据选择符中装入的索引值,TI以及RPL值,在根据相应描述符表中的段地址和段界限,进行一系列的合法检查,若该段没有问题,就将相应的描述符放入段描述符高速缓冲寄存器中。
<3>将段描述符中的32位基地址放在和ESI,EDI等中的32位有效地址相加,就形成了32位线性地址。
注意,在上面的地址转换过程中,从以下两个方面进行了保护。
(1)在一个段内,如果偏移量大于段界限,虚拟地址将没有意义,系统将产生异常。
(2)如果要对一个段进行访问,系统会根据段的保护属性检查访问这是否具有访问权限,如果没有则产生异常。
由虚拟地址转换到线性地址如图:
本章中的图转自:http://blog.csdn.net/h_armony/article/details/9751605
http://blog.chinaunix.net/uid-26126915-id-2981205.html