Skip to content

Latest commit

 

History

History
40 lines (25 loc) · 2.25 KB

2014-04-14-visit-segment-descriptor.md

File metadata and controls

40 lines (25 loc) · 2.25 KB
layout title category description tags
post
访问段描述符及分段单元
内存寻址
快速访问段描述符...
段描述符 分段单元

由于逻辑地址由16位段选择符和32位偏移量组成,段寄存器仅仅存放段选择符。为了加速逻辑地址到线性地址的转换,80x86处理器提供一种附加的非编程的寄存器1,供6个可编程的段寄存器使用。每一个非编程的寄存器含有8个字节的段描述符,由相应的段寄存器中的段选择符来指定。

快速访问段描述符

每当一个段选择符被装入段寄存器时,相应的段描述符就由内存装入到对应的非编程CPU寄存器。从那时起,针对那个段的逻辑地址转换就可以不访问主存中的GDT或LDT。处理器只需直接引用存放段描述符的CPU寄存器即可。只有当段寄存器的内容改变时,才有必要访问GDT或LDT。

system 快速访问段描述符

由于一个段描述符是8字节长,因此它在GDT或LDT内的相对地址是由段选择符的最高13位的值乘以82得到的。例如如果GDT在0x000200003,且由段选择符所指定的索引号为2,即段选择符中的index值为2.那么相应的段描述符地址是0x00020000 + (2*8)。能够保存在GDT中的段描述符的最大数目是8191,即2^13-1。

这样就可以在GDT中找到段描述符的地址。

分段单元

下图显示了一个逻辑地址是怎样转换成相应的线性地址。

system 分段单元执行的操作

分段单元(segmentation)执行下列操作:

先检查段选择符中的TI字段,以决定段描述符保存在哪一个描述符表中,TI=1则在LDT中,TI=0则在GDT中。如果在GDT中,分段单元从gdtr寄存器中得到GDT的线性地址,否则从ldtr寄存器中得到LDT的线性地址。

从段选择符的index字段计算段描述符的地址,index字段的值乘以8,这个结果与gdtrldtr的内容相加。

把逻辑地址的偏移量与段描述符的Base字段的值相加就得到了线性地址。

Footnotes

  1. 一个不能被程序员所设置的寄存器。

  2. 一个段描述符的大小。

  3. 这个值保存在gdtr寄存器中。