段选择符

4.3.3  段选择符

段选择符(或称段选择子)是段的一个16位标识符,如图4-10所示。段选择符并不直接指向段,而是指向段描述符表中定义段的段描述符。段选择符的3个字段分别是:

请求特权级RPL(Requested Privilege Level)。

表指示标志TI(Table Index)。

索引值(Index)。

 
图4-10  段选择符结构

请求特权级字段RPL提供了段保护信息,将在后面作详细说明。表索引字段TI用来指出包含指定段描述符的段描述符表GDT或LDT。TI=0表示描述符在GDT中;TI=1表示描述符在LDT中。索引字段给出了描述符在GDT或LDT表中的索引项号。可见,选择符通过定位段表中的一个描述符来指定一个段,并且描述符中包含访问一个段的所有信息,如段的基地址、段长度和段属性。

例如,图4-11a中选择符(0x08)指定了GDT中具有RPL=0的段1,其索引字段值是1,TI位是0,指定GDT表。图4-11b中选择符(0x10)指定了GDT中具有RPL=0的段2,其索引字段值是2,TI位是0,指定GDT表。图4-11c中选择符(0x0f)指定了LDT中具有RPL=3的段1,其索引字段值是1,TI位是1,指定LDT表。图4-11d中选择符(0x17)指定了LDT中具有RPL=3的段2,其索引字段值是2,TI位是1,指定LDT表。实际上,图中的前4个选择符a~d分别就是Linux 0.1x内核的内核代码段、内核数据段、任务代码段和任务数据段的选择符。图4-11e中的选择符(0xffff)指定LDT表中RPL=3的段8191。其索引字段值是0b1111111111111(即8191),TI位等于1,指定LDT表。

 
(点击查看大图)图4-11  段选择符示例

另外,处理器不使用GDT表中的第1项。指向GDT该项的选择符(即索引值为0,TI标志为0的选择符)用作"空选择符",如图4-11f所示。当把空选择符加载到一个段寄存器(除了CS和SS以外)中时,处理器并不产生异常。但是当使用含有空选择符的段寄存器用于访问内存时就会产生异常。当把空选择符加载到CS或SS段寄存器中时将会导致一个异常。

对应用程序来说段选择符是作为指针变量的一部分而可见,但选择符的值通常是由链接编辑器或链接加载程序进行设置或修改,而非应用程序。

为减少地址转换时间和编程复杂性,处理器提供可存放最多6个段选择符的寄存器(如图4-12所示),即段寄存器。每个段寄存器支持特定类型的内存引用(代码、数据或堆栈)。原则上执行每个程序都起码需要把有效的段选择符加载到代码段(CS)、数据段(DS)和堆栈段(SS)寄存器中。处理器还另外提供3个辅助的数据段寄存器(ES、FS和GS),以便当前执行程序(或任务)能够访问其他几个数据段。

 
图4-12  段寄存器结构

对于访问某个段的程序,必须已经把段选择符加载到一个段寄存器中。因此,尽管一个系统可以定义很多的段,但同时只有6个段可供立即访问。若要访问其他段就需要加载这些段的选择符。

另外,为了避免每次访问内存时都去引用描述符表,去读和解码一个段描述符,每个段寄存器都有一个"可见"部分和一个"隐藏"部分(隐藏部分也被称为"描述符缓冲"或"影子寄存器")。当一个段选择符被加载到一个段寄存器可见部分中时,处理器也同时把段选择符指向的段描述符中的段地址、段限长以及访问控制信息加载到段寄存器的隐藏部分中。缓冲在段寄存器(可见和隐藏部分)中的信息使得处理器可以在进行地址转换时不再需要花费时间从段描述符中读取基地址和限长值。

由于影子寄存器含有描述符信息的一个副本,因此操作系统必须确保对描述符表的改动反映在影子寄存器中。否则描述符表中一个段的基地址或限长被修改过,但改动却没有反映到影子寄存器中。处理这种问题最简捷的方法是在对描述符表中的描述符作过任何改动之后就立刻重新加载6个段寄存器。这将把描述符表中的相应段信息重新加载到影子寄存器中,并为加载段寄存器,提供了两类加载指令:

(1)像MOV、POP、LDS、LES、LSS、LGS以及LFS,这些指令显式地直接引用段寄存器。

(2)隐式加载指令,例如使用长指针的CALL、JMP和RET指令、IRET、INTn、INTO和INT3等指令。这些指令在操作过程中会附带改变CS寄存器(和某些其他段寄存器)的内容。

MOV指令当然也可以用于把段寄存器可见部分内容存储到一个通用寄存器中。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值