如何使用页表将虚拟地址转换为物理地址?

13 memory paging memory-management virtual-memory memory-address

可以说我有一个普通的页面表:

页表(页面大小= 4k)

      Page #:  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15          
Page Frame #:  3  x  1  x  0  x  2  x  5  x   7   4   6   x   x   x
Run Code Online (Sandbox Code Playgroud)

如何将51996之类的任意逻辑地址转换为物理内存地址?


如果我使用log base 2(4096),我得到12.我认为这是我想用于地址偏移的位数.

我只是不确定.51996/4096 = 12.69.那么这是否意味着它位于第12页,具有一定的偏移量?

然后我如何将其转换为"51996"的物理地址?

Par*_*XoN 21

要确定给定存储器地址的页面,请取第一个P位(N位)编号.

P = lg2(numberOfPages)
在您的示例中,P = lg2(16)= 4

所以给定内存地址的前4位将告诉我们页面.这意味着剩下的应该是从该页面开始的偏移量.

您的示例地址51996是二进制的1100101100011100.即[1100:101100011100].

1100(十进制12)是页码
101100011100(十进制2844)是偏移量

现在我们需要找到第12页在内存中的位置.
查看您的框架表,看起来页面12位于第6帧中.在所有内存都可分页的系统中(即没有内存映射IO),第6页帧将位于(entriesPerPage*frameNum)-1

在这种情况下,4000*6-1 = 23999(由于内存为0索引,因此需要"-1".)

在这种情况下,4096*6-1 = 24575(由于内存为0索引,因此需要"-1".)

现在我们要做的就是添加偏移量,我们有物理内存地址:

23999 + 2844 = 26843 = 0x68DB

24575 + 2844 = 27419 = 0x6B1B

完成!

希望这(编辑)是有用的XD

编辑:感谢Jel抓住我的错误:)感谢user8抓住我的其他错误!(frameNum而不是pageNum).


Zif*_*fre 1

如果我正确理解你的问题(我可能没有),你想知道如何使用页表结构从虚拟地址找到物理地址。在这种情况下,假装您是处理者。使用地址的10个最高有效位来查找页目录中的页表(顶级页表)。接下来的 10 位是页表(较低级别页表)的索引。使用该页表条目中的地址来查找物理页地址。最后十位是页中的字节地址。

顺便说一句,您可能会在OSDev等面向操作系统的网站上找到更多能够理解此类问题的人。我无法在这个答案中详细说明,因为我已经很多年没有做过此类事情了。