我正在学习不同类型的内存管理。我不明白在虚拟地址中有一个偏移位。还有为什么页面大小强大2
?
我的主要困惑是: 给我一个在指令中用来访问某个虚拟地址的偏移的例子吗?
我的第二个困惑是:
通常的说法是,如果逻辑地址的大小为2^m
且页面大小为2^n
,则逻辑地址的高位mn位指定页码。
答案 0 :(得分:25)
我认为你的主要和次要混淆是由于对这个问题的普遍混淆:)
让我谈谈这一点,希望我能得到一些帮助。首先,一个类比 - 想象一下,你正试图找到一个城市的房子。想象一下,每个房子都有一个独特的数字 - 你可以想象房屋的数量会很快变得非常庞大和令人困惑。现在想象一下,你介绍了街道的概念 - 房屋号码现在变得更加可管理,因为你把它们分成了很好的块。所以:街道=页码,门牌号码=偏移地址。
拥有虚拟内存页面的重点是允许计算机将内存刻录成可管理的块,而不是浪费太多。将其分成块(页面)可以精确控制访问,分页和其他类似的东西。您的页面越小,您将浪费的内存越少(如果进程A需要32k内存,而您的页面大小为64k,那么最终会得到一些未使用的内存),但是系统开销。
至于为什么页面大小是2的幂,这是在地址内不浪费的空间。由于计算机基于二进制(目前),所有内容都可以归结为2的幂。想象一下,如果你有基于因子10的东西.10的二进制是1010 - 你必须使用4位来保存它,那么为什么不选择4位的全部值:0000 - 1111(0到15 = 16个值)。
对不起,我有点胡扯了 - 我希望这能帮助你朝着正确的方向前进!
答案 1 :(得分:2)
我喜欢GHC与街道和城市的类比,说明我们为什么需要寻呼。同样,将内存字节分组到页面中也可以使CPU占用更多的内存。
假设提供以下属性:
这是我制作的一个图,它显示了如何使用页码和页偏移量来寻址内存中的特定单元:
有一个虚拟地址,由CPU生成,由虚拟页码(20位)和页面偏移量(12位)组成。
还有一个页面映射,用于虚拟页面号到物理页面号的映射(另外,脏位显示页面是否已更改/常驻位显示页面是否驻留在内存中),右侧是内存的存储方式分成几页(在图中为蓝色)。
使用20个地址位将虚拟页码传递到页面地图。由于页码以具有20个地址位的二进制形式传递,这意味着该页映射最多可具有2 ^ 20条记录(由于使用20位,您可以获得2 ^ 20个不同的编号),这也是页码具有幂的原因。 2。
因此,使用页面映射可以找到将哪个物理页面编号映射到所请求的虚拟页面编号,而页面偏移量不会改变。具有物理页码和页面偏移量,您就有物理地址。使用页码转到内存的特定页面,使用偏移量转到特定的字节单元。 (页面偏移量也定义了页面大小,因为偏移量的12位表示我们可以在页面内寻址2 ^ 12 = 4096个单元(在图中为橙色))
在绿色中,您可以看到一个示例,其中我们请求虚拟页面编号2,其页面偏移量为4095。根据页面映射,虚拟页面编号2映射到物理页面15,这为我们提供了物理地址为15和偏移量的物理地址。 4095。(通常虚拟/物理页码和页偏移量将以十六进制显示,但我使用十进制只是为了简化)
PS:
示例数据摘自本讲座-https://www.youtube.com/watch?v=3akTtCu_F_k-它提供了很好的虚拟内存概述。
答案 2 :(得分:1)
我有同样的困惑,但如果我理解它,那么它就像下面这样:除了对该主题的一般理解之外,2个案例的力量稍微有点。它更像是一个约定,因为我们处理的是二进制值,需要在2的幂适当的位之间进行适当的划分。
例如,如果pGe具有64k个字并且每帧有4个字,则2 ^ x = 64 - > x = 6
这意味着每个帧可以具有构成6个二进制值I.e的物理地址。 0或1,其中4代表帧号。最后在4中表示单词的确切位置。
请注意,此处每个帧不能包含5个或任何其他值,或者所谓的约定失败。