linux中段机制的简短理解

来源:互联网 发布:angularjs.js 1.3下载 编辑:程序博客网 时间:2024/04/28 04:28

1:段的参数定义:段基地址,段限长,段属性(都保存在段描述符中)

(段限长是虚拟地址中最大的偏移量,段属性指的是是否可读可写,权限值等)

80x86系统中,拥有4g的地址空间(2的32次幂),0x00000000-0xffffffff。

段基地址和段限长决定了虚拟地址的空间位置,并且,空间位置可以重叠。


2:段描述符

    段描述符保存在段描述表(一个简单的数组)中。

3:逻辑地址和线性地址

    逻辑地址(Logical Address) 是指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数据段的地址,不和绝对物理地址相干。

       线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层。程式代码会产生逻辑地址,或说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。


首先,给定一个完整的逻辑地址[段选择符:段内偏移地址],

1、看段选择符的T1=0还是1,知道当前要转换是GDT中的段,还是LDT中的段,再根据相应寄存器,得到其地址和大小。我们就有了一个数组了。

2、拿出段选择符中前13位,可以在这个数组中,查找到对应的段描述符,这样,它了Base,即基地址就知道了。

3、把Base + offset,就是要转换的线性地址了。 还是挺简单的,对于软件来讲,原则上就需要把硬件转换所需的信息准备好,就可以让硬件来完成这个转换了。

 备注:分页机制实现

Linux2.6分页

        cr3:页目录的基地址


(参考博文:http://blog.csdn.net/do2jiang/article/details/4512417)


0 0