手动虚拟地址转换

时间:2012-11-10 05:32:56

标签: linux translation paging virtual-address-space

我已经看了几篇与此相关的不同文章,但没有一篇以我能理解和复制的方式解释这个解决方案。我需要知道如何根据以下内容将物理地址转换为内存中的虚拟地址:

一个简单的虚拟内存系统具有32KB物理内存和16位虚拟地址,其中12位用作偏移量。以下是其中一个进程的页表的当前内容:

enter image description here

所以基本上我认为这个虚拟内存系统的页面大小是1024KB。我需要一个过程来找到VA B2A0的相应PA。如果你能告诉我我可以从那里开始的过程,你就不必给我最终的解决方案:)

先谢谢你们。此外,如果你知道一篇文章已经做到这一点而且我错过了它,请随时链接我。

干杯。

2 个答案:

答案 0 :(得分:0)

32 KB是2 ^ 15。 因此每个物理地址有15位,其中12位用作偏移,高3位作为页框数。

0xb2a0所在的虚拟页面是什么?为了确定这一点,我们需要取地址的比特,高于2 ^ 12。页面大小为2 ^ 12,即4096或0x1000,因此它是虚拟页面编号0xb = 11(0xb2a0 / 0x1000的底限)。页面内的偏移量为0xb2a0模数为0x1000,为0x2a0。

然后使用该表将虚拟页码11转换为物理页面框架。虚拟页面存在(1),并且它对应于具有较高位111的物理帧号,即二进制的111 + 12 0,=> 0x7000 - 它是物理帧起始的地址。

我们的物理地址位于偏移量0x2a0处,因此,寻找的物理地址为0x7000 + 0x2a0 = 0x72a0。

请按照此流程向您说明。如果您有任何疑问,请先阅读维基百科,如果仍然不清楚,请询问:)

答案 1 :(得分:-1)

我正在尝试进行考试复习和学习,但我无法找到同样问题的可靠答案。我巩固了我所学到的知识,我希望无论我在这里总结什么,都能帮助像我这样的人。 :)

我发现上面的答案中的解释对我的小脑子来说有点难以理解。

我认为以下链接比维基百科的解释提供了更好的概述: http://williams.comp.ncat.edu/addrtrans.htm

此YouTube视频还提供了解释虚拟地址转换过程的出色指南: https://www.youtube.com/watch?v=6neHHkI0Z0o

回到问题 - >>>

第一个问题是 - '页面大小'这个虚拟内存系统? 基于此处的定义 - https://en.wikipedia.org/wiki/Page_(computer_memory)

我最初在'页面之间感到困惑。和'页面大小'但我现在想出来了。 Pages确定可用的页数(如书中),页面大小如下(书中的A4,A5,A6页面。)。

因此,由于虚拟内存和物理内存偏移相同并相应地进行映射,因此我们可以通过偏移大小确定页面大小。如果偏移大小为12位,那么2 ^ 12 = 4,096 Byte a.k.a 4-KB。

好奇心灵的问题,有多少虚拟内存页面? - 16位虚拟地址空间减去12位偏移= 4位 - 等于2 ^ 4 = 16页可用(因此我们看到的表格!)

其他好奇心灵的另一个问题是,有多少个物理内存页面? - 32KB物理内存= 32 x 1024bytes = 32,768字节 - Log(32768)/ Log(2)= 15位,对于总物理MEMORY也意味着2 ^ 15 - 减去我们已经知道的12位偏移量... - 15位(总物理内存)减去12位(偏移)= 3位用于物理地址空间

转到下一个问题,虚拟地址0xb2a0的相应物理地址是什么(当前以十六进制表示法设置)?

上面的@Dmytro Sirenko答案解释得很清楚,我会在这里帮忙改写一下。

我们需要记住,我们的虚拟地址是 - 16位,现在包含的地址空间是value = b2a0(忽略0x)。

我的捷径(如果我错了请纠正我),是因为地址:偏差(页面大小)的比例是4:12 = 1:3 ......

b            |  2  a  0
^
page number  |  offset

将十六进制值b转换为十进制= 11.

我查看表格,并在表格编号11中找到了Page Frame = 111。

111以二进制表示,它与物理内存帧相关。

请记住,我们正在查看15位的物理内存地址空间,因此,我们可以确定:

1 1 1    |   0 0 0 0 0 0 0 0 0 0 0 0 
Address  |   offset

由于Offset直接从虚拟内存映射到物理内存,我们将(2a0)的值直接放入物理内存。不幸的是,我们无法立即在此处表示它,因为它是十六进制格式,而我的上述地址空间是以二进制格式设置的。

考虑到我将在考试中接受考试而且我不会被允许带入计算器...我会反过来以十六进制回答。 :)

当我们将111转换为十进制时(我按001 = 1,010 = 2,100 = 4,101 = 5,110 = 6,111 = 7)。 现在我需要从十进制转换为十六进制! = 7(dec)= 7

因此,此虚拟内存地址的相应物理内存位置是....(响亮的鼓和窗帘打开....)

7 2 a 0

以这种方式标注为0x72a0。