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

Rua*_*uan 14 memory virtual operating-system memory-management

以下页表适用于具有16位虚拟和物理地址以及4,096字节页的系统.引用页面时,引用位设置为1.一个线程周期性地将参考位的所有值清零.所有数字都以十进制形式提供. 在此输入图像描述

我想将以下虚拟地址(十六进制)转换为等效的物理地址.另外,我想为页表中的相应条目设置引用位.

0xE12C

0x3A9D

0xA9D9

0x7001

0xACA1

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

0xE12C ? 0x312C
0x3A9D ? 0xAA9D
0xA9D9 ? 0x59D9
0x7001 ? 0xF001
0xACA1 ? 0x5CA1
Run Code Online (Sandbox Code Playgroud)

我发现并尝试了这个,但它对我帮助不大.

Aka*_*tra 15

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

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

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


Ton*_*ous 13

要将虚拟地址转换为物理地址,我们需要知道3件事:

  • 物理内存大小(对于这个例子,它并不重要..看 log2(Page-Size)
  • 页面大小
  • 虚拟地址的位数

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

首先,我们需要确定在页面内作为偏移量所需的位数.
log2(4096)= 2^4 = 16= 12位用于偏移

在虚拟地址的16位中,12位用于偏移,这意味着每个进程都有0xE12C虚拟页面.页表中的每个条目存储容纳页面的相应框架.例如:

在此输入图像描述

现在让我们翻译!

首先,为了方便工作,我们可以转换binary0x3A9D.

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

让它连接到12个偏移位

Answer: (0011 0001 0010 1100) = 0x312C
Run Code Online (Sandbox Code Playgroud)

另一个例子: log2(Page-Size)

0x3A9D = 0011 1010 1001 1101
0011 = 3
PageTable[3] = 10
10 in decimal = 1010 in binary
1010 1010 1001 1101 in binary = 0xAA9D
Run Code Online (Sandbox Code Playgroud)

log2(4096)如果页表条目包含更多信息,我们需要知道引用每个帧所需的位数.在我们的例子中它是2^4 = 16位.也就是说,如果页表项包含6位,我们知道它们只0xE12C用于帧号,其余用于标志.

例如:

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


jok*_*oke 5

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

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

因此,我们现在有:

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

我们正在到达那里......请耐心等待!:)

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

现在让我们屠宰地址...

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

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

地址和偏移量的映射

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

有了十六进制格式的'E'信息,我需要转换为Decimal = 14。然后我查看您提供的表格,发现页面框架'3'。页框 3 以十进制格式记录,然后需要将其转换回十六进制格式...... 呃!......这是 3!

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

然后您将返回到表,并参考引用位列并将“1”放入第 14 行。

对这些应用相同的概念 -

0x3A9D ? 0xAA9D
0xA9D9 ? 0x59D9
0x7001 ? 0xF001
0xACA1 ? 0x5CA1
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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