分页机制

来源:互联网 发布:v盾网络验证 编辑:程序博客网 时间:2024/05/17 02:46

分段机制,在Linux其实已经没有什么要讲的必要,GDT中的段机制基本上都是0,而且段长都是4G,所以这个时候我们可以简单的认为:进程的逻辑地址和线性地址是等价的。

有了线性的地址,下一步就是如何对应为物理地址,大家想一下,每个程序经过编译都具有相同的逻辑地址,也就是说相同的线性地址,这个情况下如何映射为不同的物理地址呢,对,分页机制,它不就是使用虚拟地址产生的吗。但是不知道你有没有和我一样迷惑过:相同进程空间地址如何映射为不同的物理地址,什么流程??

经过不断的迷惑,甚至到了睡不着觉的地步,问了很多和我一个级别的人,呵呵,方法不对哈,但是就是没找到合理的答案。《深入理解Linux内核》其实有了详实的说明,如果你还不明白就去那里面看看,不过这本书很好,而且大部分都是在说内存的方面,讲的不是一个好字可以形容的。我看了,但是那本书太厚了,我是一个急性子,捡重点的看吧。

啊哈,首先,硬件和软件形结合搞定了,very easy:

(1)硬件CR3,控制寄存器,不可编程,因此对程序员,来说用到它的地方不多,除非自己去编写内核;

(2)软件:中断机制,主要是为了获得内存信息,用来填充进程的PDT和PET,说白了就是映射线性地址和物理地址的物理条件;

以上两步中的所有机构的填充都是内核完成,如果不理解请将内核理解为一种调度程序,填充CR3和PET,PET。有了这些寄存器就可以很容易的实现地址映射了。(不知道能不能画图,似乎不行,算了),我要画的图很简单,在百度,google用“页机制内存映射 图片”能搞定一大票子,看大同小异的部分就可以了。

 

上面提到的CR3是用来指定PDT的基地址;PDT 里面是什么东西呢,PET的基地址;PET里面是页的基地址。明白了,映射就是这个样的,每个线性地址的前10位是CR3指定的基地址的偏移量,也就是用了它和CR3既可以去定PDT项了。完成一步

每个线性地址的中间10位和PDT存储的值相加,啊哈,不就是PET的地址吗。完成二步

PET中的地址是页的首地址,加上线性地址的后12位,不就是指令在页中的地址吗。完成

 

以上过程基本上就是地址找寻关系了,很简单不是吗。只要修改cr3,PDT,PET中的值,就可以实现相同的线性地址不同物理地址的映射,当然这些工作都是内核帮我们做的,不了解照样用系统,了解了多增长点见识,当然这是写给和我一样,喜欢寻根问底的人,当然文章写的比较简略,如果还不明白的话,可以去看看操作系统的一些书籍,尤其是讲实践的,理论的书不太推荐,因为理论就是框架,框架就是没有细节,没有细节?!你找的不就是细节吗!

 

找过资料后还没有理解,可以直接留言,我会尽量给你一个明白的答复。(下个目标,中断)


原创粉丝点击