80x86逻辑地址到线性地址的转换

先梳理一下概念:

逻辑地址是由16位的段选择符和32位的偏移量组成;

段选择符是有13为的index,1位TI,2位RPL组成;

段选择符存在CPU的段寄存器中;

段描述符放在全局描述符标GDT或者局部描述符LDT中;

段描述符是8字节64位,里面有Base字段是该段的首字节的线性地址;

(notice)段描述符原始是存在GDT 或者 LDT中的,但是80x86处理器提供了一组非编程的CPU寄存器来存储该对应的段描述符。(这样就能每次不用访问主存中的GDT,只要CPU中的段寄存器的内容没有发生改变,可以直接从CPU的寄存器中直接获取段描述符,达到快速访问)

GDT的在主存中的首地址放在gdtr控制寄存器中;

LDT的在主存中的首地址放在ldtr控制寄存器中;

逻辑地址到线性地址的转换过程:
逻辑地址中的段选择符的13为index*8(因为是段描述符是8字节,现在是计算他的地址所以*8)+gdtr寄存器(或者ldtr寄存器)中的GDT(或者LDT)【由段选择符的TI位决定】的首地址,得到在GDT(LDT)中的段描述符;
段描述符的Base+逻辑地址的32位偏移量得到该逻辑地址对应的线性地址。

每个进程的逻辑地址的区别:

分段给每个进程分配其能访问的线性地址的范围,而这个会记录在给进程的GDT中的段描述符中的Base字段跟Limit字段

进程间的逻辑地址的区别是前面16位的段选择符不一样,这个是由操作系统分配给他们的,后面的32位偏移量是没有进程的区别概念的,它就是一个简单的偏移量而已,最终觉得如何将逻辑地址转换为线性地址还是主要靠段选择符的13为index跟1位TI以及段描述符中的Base字段决定,当然肯定是会加上没有进程意义的32位偏移量。

猜你喜欢

转载自gooneal.iteye.com/blog/1961275