linux下的分段分页机制将一个逻辑地址转换到物理地址的问题?

问题描述:

linux下的分段分页机制将一个逻辑地址转换到物理地址的问题?
一个逻辑地址经过分段后得到的是线性地址,我挺郁闷的这个线性地址到底如何得到的?应为linux的线性地址是个32位的地址,高10为保存目录项,中间10位保存页表项,然后低12为对应物理页偏移地址.然而这个逻辑地址是经过选择子选出来的段基址,加上段内偏移,出来确实是个32位地址.似乎这个中间的步骤被屏蔽了是吧?我想知道这里面是如果把逻辑地址转换成这个分成三个部分索引的线性地址!前面是段基址然后段偏移就出来个线性地址这叫我无法接受,刨根究底!
1个回答 分类:综合 2014-11-20

问题解答:

我来补答
        你要问的应该是Intel系列CPU的寻址吧?其他系列的CPU没有逻辑地址线性地址以及程序地址之分的,这三者是同一回事,但是Intel系列CPU为了保持向前兼容,不得已这样做的.以80386为例简单说一下吧:
        在以前Intel 8086中逻辑地址是这样的格式,16位段地址(CS,DS,SS,ES):16位段内偏移.
        在80386中,为了兼容8086,新增两个段寄存器,一个是全局性的段描述表寄存器GDTR,另一个是局部性的段描述表寄存器LDTR,分别用来指向存储在内存中的一个段描述结构数组,或称为段描述表.
        在此基础上,段寄存器的高13位用作访问段描述表中具体描述结构的下标(index),如下图:


GDTR或者LDTR中的段描述表的指针和段寄存器中的index结合在一起,确定了一个具体的段描述表项,每个表项(64位,8字节)的定义如下图:

        结构中的B31~B24和B23~B16分别为基地址的bit16~bit23和bit24~bit31.这样,16位基地值确定了,将这16位地址左移16位,与上逻辑地址的16位段内偏移地址,就得到32位的线性地址,其后的线性地址到物理地址的转换你明白的,就不多说了.
 
 
展开全文阅读
剩余:2000
上一页:ghhhhh
下一页:概括每段段意