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).
如果我正确理解你的问题(我可能没有),你想知道如何使用页表结构从虚拟地址找到物理地址。在这种情况下,假装您是处理者。使用地址的10个最高有效位来查找页目录中的页表(顶级页表)。接下来的 10 位是页表(较低级别页表)的索引。使用该页表条目中的地址来查找物理页地址。最后十位是页中的字节地址。
顺便说一句,您可能会在OSDev等面向操作系统的网站上找到更多能够理解此类问题的人。我无法在这个答案中详细说明,因为我已经很多年没有做过此类事情了。