layout | title | category | description | tags |
---|---|---|---|---|
post |
访问段描述符及分段单元 |
内存寻址 |
快速访问段描述符... |
段描述符 分段单元 |
由于逻辑地址由16位段选择符和32位偏移量组成,段寄存器仅仅存放段选择符。为了加速逻辑地址到线性地址的转换,80x86处理器提供一种附加的非编程的寄存器1,供6个可编程的段寄存器使用。每一个非编程的寄存器含有8个字节的段描述符,由相应的段寄存器中的段选择符来指定。
每当一个段选择符被装入段寄存器时,相应的段描述符就由内存装入到对应的非编程CPU寄存器。从那时起,针对那个段的逻辑地址转换就可以不访问主存中的GDT或LDT。处理器只需直接引用存放段描述符的CPU寄存器即可。只有当段寄存器的内容改变时,才有必要访问GDT或LDT。
由于一个段描述符是8字节长,因此它在GDT或LDT内的相对地址是由段选择符的最高13位的值乘以82得到的。例如如果GDT在0x000200003,且由段选择符所指定的索引号为2,即段选择符中的index值为2.那么相应的段描述符地址是0x00020000 + (2*8)。能够保存在GDT中的段描述符的最大数目是8191,即2^13-1。
这样就可以在GDT中找到段描述符的地址。
下图显示了一个逻辑地址是怎样转换成相应的线性地址。
分段单元(segmentation)执行下列操作:
先检查段选择符中的TI字段,以决定段描述符保存在哪一个描述符表中,TI=1则在LDT中,TI=0则在GDT中。如果在GDT中,分段单元从gdtr寄存器中得到GDT的线性地址,否则从ldtr寄存器中得到LDT的线性地址。
从段选择符的index字段计算段描述符的地址,index字段的值乘以8,这个结果与gdtr或ldtr的内容相加。
把逻辑地址的偏移量与段描述符的Base字段的值相加就得到了线性地址。