将虚拟地址转换为物理地址

Posted

技术标签:

【中文标题】将虚拟地址转换为物理地址【英文标题】:translate virtual address to physical address 【发布时间】:2017-03-10 14:56:40 【问题描述】:

以下页表适用于具有 16 位虚拟和物理地址以及 4,096 字节页面的系统。当页面被引用时,引用位设置为 1。线程定期将参考位的所有值清零。所有数字均以十进制提供。

我想将以下虚拟地址(十六进制)转换为等效的物理地址。我还想为页表中的相应条目设置参考位。

0xE12C

0x3A9D

0xA9D9

0x7001

0xACA1

我知道答案是,但我想知道如何才能获得这些答案:

0xE12C → 0x312C
0x3A9D → 0xAA9D
0xA9D9 → 0x59D9
0x7001 → 0xF001
0xACA1 → 0x5CA1

我找到并尝试了This,但对我没有多大帮助。

【问题讨论】:

【参考方案1】:

要将虚拟地址转换为物理地址(应用于此作业问题),我们需要知道2 事情:

页面大小 虚拟地址的位数

在此示例中:16 位系统4KB 页面大小物理内存大小64KB

首先,我们需要确定作为页内偏移量所需的位数。 log2(Page-Size) = log2(4096) = 12 位用于偏移

在虚拟地址的 16 位中,12 位用于偏移,这意味着每个进程都有2^4 = 16 虚拟页。页表中的每个条目都存储了容纳该页的相应框架。例如:

现在让我们翻译!

首先为了方便工作,让我们将0xE12C 转换为binary

0xE12C = (1110 0001 0010 1100) in base 2
1110 = 14 in decimal
Entry 14 in P.T => Page frame 3.

让我们将它连接到 12 个偏移位

Answer: (0011 0001 0010 1100) = 0x312C

另一个例子:0x3A9D

0x3A9D = 0011 1010 1001 1101
0011 = 3
PageTable[3] = 10
10 in decimal = 1010 in binary
1010 1010 1001 1101 in binary = 0xAA9D

【讨论】:

【参考方案2】:

假设虚拟地址为 16 位长。因此,虚拟地址空间中有 2^16 个地址。 页面大小为 4 KB(一个页面中有 4K (4 * (2 ^ 10) ) 个地址),因此页面数将为 ( 2^16 ) / ( 2 ^ 12 ) = 2 ^ 4。 要寻址每一页,需要 4 位。 虚拟地址中最重要的 4 位将表示被引用的页码,其余 12 位将是页偏移量。

要记住的一件事是页面大小(在虚拟地址空间中)始终与主存储器中的帧大小相同。因此,物理地址的最后 12 位将与虚拟地址的最后 12 位保持一致。

要获取主存储器中的帧地址,只需使用前 4 位。 示例:考虑虚拟地址 0xACA1 这里 ACA1 中的 A 表示页号(10),对应的帧号为 5(0101),因此生成的物理地址将是 → 0x5CA1。

【讨论】:

【参考方案3】:

为了帮助您解决这个问题,我们需要正确填写我们的详细信息:

    16 位虚拟地址空间 = 2^16 = 65,536 个地址空间 16 位物理地址空间 = 2^16 = 65,536 个地址空间 4096 字节页面大小决定偏移量,即 Log(4096) / Log (2) = 12 位。这意味着,页面大小为 2^12 根据@Akash Mahapatra,虚拟地址的偏移量直接映射到物理地址的偏移量

因此,我们现在有:

2^16(16 位)用于虚拟地址 - 2^12(12 位)用于偏移 = 4 位用于页面,或者更确切地说是可用页面的总数。 我不会重复计算物理,因为它是相同的数字。 2^4 (4bit) 页面 = 16,这与上面的表格条目数相关!

我们快到了……请耐心等待! :)

十六进制表示法的内存地址 0xE12C 也被称为保存 16 位地址。 (因为它在问题中说明。)

让我们现在就杀掉地址吧……

我们首先从信息中删除“0x”。

我们可以将 E12C 转换为像 @Tony Tannous 这样的二进制符号,但我将应用一些捷径。

我只是使用一个比率。嗯,地址用上面的4个字符表示,由于16/4 = 4,我可以定义第一个字母为虚拟地址,而其他3个为偏移地址。

有了十六进制格式的“E”信息,我需要将其转换为十进制 = 14。然后我查看您提供的表格,发现页框“3”。页框 3 以十进制格式注明,然后需要转换回十六进制格式... Duh!... 是 3!

所以,0xE12C的虚拟内存位置的物理地址映射可以在物理内存的0x312C处找到。

然后您将返回表格,参考参考位列并将“1”放在第 14 行。

对这些应用相同的概念 -

0x3A9D → 0xAA9D
0xA9D9 → 0x59D9
0x7001 → 0xF001
0xACA1 → 0x5CA1

如果您注意到,最后 3 位数字是相同的(这决定了偏移量)。 并且根据表格映射了4位数字中的第一个:

table entry 3 -> page frame 10 -> hex notation A
table entry A (10) -> page frame 5 -> hex notation 5
table entry 7 -> page frame 15 -> hex notation F
table entry A (10) -> page frame 5 -> hex notation 5

希望这个解释能帮助你和像我这样的其他人! :)

【讨论】:

以上是关于将虚拟地址转换为物理地址的主要内容,如果未能解决你的问题,请参考以下文章

如何将虚拟内存地址转换为物理地址?

如何将页表的虚拟地址转换为其实际物理地址?

利用/proc/pid/pagemap将虚拟地址转换为物理地址

如何把物理路径转换成虚拟路径

在Windows内核地址空间中将虚拟地址转换为物理地址

在 Linux 中将物理地址转换为虚拟地址并读取其内容