考虑一个线性地址转换物理地址的过程

来源:互联网 发布:rx1r2 知乎 编辑:程序博客网 时间:2024/06/06 03:23

考虑一个线性地址转换物理地址的过程

32位平台伤,


如果一个线性地址位:00011010 0011 1000 0100 1100 0001 0001a),

根据CR3找到页目录(考虑在linux0.1x下面只有一个页目录表的情况下)。根据线性地址的高10位即00011010 00aa),在

页目录表中索引,找到其页表的地址,假设第0001101000项的值位0011 10001010 1001 0100 0101 0011 0100b) ,这个值就是表示这个进程的页表的首地值,从而可以找到页表的位置。

然后,取线性地址的中间10位,即111000 0100,从页表中开始索引,找到其1110000100项,假设,这个位置是

00000011 0111 1010 1000 1100 1001 0001c),这就是代表这这个线性地址所映射的物理页面的基地址,

然后,把线性地址的后12位取出,即11000001 0001,然后加上这个基地址。

0000 00110111 1010 1000 1100 1001 0001 + 1100 0001 0001=最后的物理地址,over


在索引页目录或者页表的时候,由于每个页目录项或页表项都是32位的地址,即4B,在代码中,可以用高10位(索引页目录项时候)或中间10位(索引页表项时候)<<2即乘以4的方式得到。例如例子中,

得到b的值,可以用aa*4+CR3的值,然后从这个地址中取出,就是b。起始也可页用数的方式,即从页目录中数aa个项,一样的。

续:1,在32位平台上,线性地址和物理地址都是32位的,只不过表示的大小不同。

       2,本例子中的数字不一定符合真实情况,只是为了说明逻辑关系。

       3,在真实的情况下,所有的页目录项和页表项的后面12位,和地址表示没有关系,是页的管理属性,

即使它们不为0,在找页的时候,也会把后面12位当作0来找页,比如地址b,0011 10001010 1001 0100 0101 0011 0100b),它要如何找到所对应的页的地址呢?即把后面12位全部看作0就可以了,即真实的页的地址在

0011 10001010 1001 0100 0000 0000 0000 处(这是物理地址)。后面的12位表示这个页的一些属性,所以,不要困惑。

补两张图




补充:*******重要。


我们说每个进程有0-3G的线性空间,3G-4G是内核空间。那么具体来说是个什么意思呢?还是看上面的那张页目录和页表的大图,这张图很好。其实,每个进程的页目录中,前面从0-767项是刚好映射到了3GB=768*4M=3GB. 768-1023项刚好映射了256*4M=1GB大概就是这么个情况,那么,既然内核只有一个,即内核空间中的东西每个进程看到的都是一样的。所以,每个进程的页目录0-767项不一样,但768-1023项都是一样的,即共享内核。就是这么个意思。进程0因为不会进入用户空间,它的前768项是空的,只有后面才有东西。每个进程通过中断或者系统调用,进入内核空间,就用到了后面的项来映射,且都是一样的。

0 0
原创粉丝点击