学习过程中做到一道题
在网络上看到有关书本比喻的解答(见链接网站第一条回复,链接:某计算机采用二级页表的分页存储管理方式,按字节编址,页面大小__牛客网),其回答不仅绕弯,还使简单问题复杂化。自己思考清晰后,决定基于这道题的数据,对二级页表逻辑地址到物理地址的转换过程做一次小结,如下:
先来看二级页表地址转换的原理
首先我们要知道,为什么会有地址转换?为什么要有二级页表?
表示逻辑地址的内存内容,如果连续地存储在物理内存中,太大了,比如linux X86平台的逻辑地址共有32位,也就是4GB空间,要在物理内存中找到一片连续的4GB空闲空间是困难的。因此人们想到把逻辑地址内存按一页一页拆开,一页一页分散地存放在物理内存中。
逻辑地址一大块内容,按照1024B大小的内容为一页划分,划分出(64K)页。另拿一个页表来记录这逻辑地址中,划分出来的每一页,对应物理内存中的哪一页框,因为逻辑地址中划分出来了 页,所以这页表要记录 条,每一条2B,所以这个页表大小为:
B。这个页表也放在物理内存中。
现在,这个页表太大了,把它也按一页一页拆开,一页一页分散地存放在物理内存中。
把这个页表也按照1024B大小的内容为一页划分,划分出 页,再拿另一个,叫做页目录表的表,来记录这页表中划分出的每一页,对应存放页表的物理内存中的哪一页框,因为页表中划分出来了 页,所以这页目录表中自然要记录 条,如果一条页目录表项为 n B,还能知道这页目录表大小为 ( n) B。这个页目录表也存放在物理内存中,页目录表的地址在C3寄存器中,固定的。本来挺简单的东西,经过这书本一比喻,反而不清晰了。
现在,逻辑地址内存划分为 页,每页 条地址,一共要可以表示 条地址,所以逻辑地址有26位。
页目录表里有多少条记录? 条,所以为了能表示页目录表中的每一条,页目录表要走7位。
页目录表里的每一条记录指向页表中的一页(即:一个页表页),页表的一个页表页中有几条记录? 条,所以为了能表示一个页表页中的每一条,页表页要走9位。
最后10位就是页内偏移(或者页内位移,我一直认为是同一个意思,毕竟ctf的pwn题中经常用到地址偏移,那是后话了),这在地址转换中的最后会用到。
最后来看地址转换
因此,拿到一条26位的逻辑地址时:
先看首7位,锁定了页目录表中的哪一条,即锁定了页表中的哪一页;
再往后看9位,锁定了页表中的这一页(这一个页表页)中的哪一条记录,这记录就锁定了该逻辑地址在物理内存中对应的页框号,假设是m;
那么,m*页框大小(本题中,B)+页内偏移=物理地址,这就是我们最终得到的物理地址了。
以Intel x86平台32位逻辑地址为例
最后,看一个例子做总结(也是做到的题目啦),如下图: