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

时间:2016-10-27 19:31:54

标签: memory memory-management operating-system virtual

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

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

0xE12C

0x3A9D

0xA9D9

0x7001

0xACA1

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

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

我找到并尝试了This,但这对我没什么帮助。

3 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:13)

要将虚拟地址转换为实体地址,我们需要知道 3 的内容:

  • 物理内存大小(对于此示例,它并不重要..查看[1]
  • 页面大小
  • 虚拟地址的位数

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

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

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

enter image description here

现在让我们翻译!

首先,为了便于工作,我们可以将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

[1]如果页表条目包含更多信息,我们需要知道引用每个帧所需的位数。在我们的例子中,它是log2(64KB/4KB) = log2(16) = 4位。也就是说,如果页表项包含6位,我们知道它们只有4用于帧号,其余用于标志。

例如:

| page | page frame |
|-------------------|
|  5   |  100101    |

Page 5 is mapped to frame number 1001 = frame number 9.

答案 2 :(得分:1)

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

  1. 16位虚拟地址空间= 2 ^ 16 = 65,536地址空间
  2. 16位物理地址空间= 2 ^ 16 = 65,536地址空间
  3. 4096字节页面大小确定偏移量,即Log(4096)/ Log(2)= 12 bit。这意味着,页面大小为2 ^ 12
  4. 根据@Akash Mahapatra,虚拟地址的偏移量直接映射到物理地址的偏移量
  5. 因此,我们现在有:

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

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

    以十六进制表示法存储器地址0xE12C也称为保持16位地址。 (因为它在问题中说明了。)

    现在让我们的地址屠杀......

    我们先删除&#39; 0x&#39;来自信息。

    我们可以将E12C转换成@Tony Tannous这样的二进制符号,但我会稍微应用一下。

    Mapping of the Address and Offset

    我只是使用比率。好吧,地址用4个字符表示,由于16/4 = 4,我可以将第一个字母定义为虚拟地址,而另外3个是偏移地址。

    有了这些信息,&#39; E&#39;在十六进制格式中,我需要转换为Decimal = 14.然后我看看你提供的表格,我找到了页面框架&#39; 3&#39;。页面框架3以十进制格式标记,然后需要转换回十六进制格式... Duh!...这是3!

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

    然后,您将返回到该表,并参考参考位列并输入&#39; 1&#39;到第14行。

    对这些应用相同的概念 -

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

    如果您注意到,最后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
    

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