页码和偏移量

23

我正在学习不同类型的内存管理。我不明白虚拟地址为什么需要偏移位,以及为什么页大小要设为2的幂次方。

  • 我的主要困惑是: 请给我一个例子,解释指令中如何使用偏移量来访问某个虚拟地址?

  • 我的第二个困惑是: 通常说法是,如果逻辑地址的大小为2^m,而页面大小为2^n,那么逻辑地址的高位 m-n 位用于指定页号。

3个回答

47
我认为你的主次误解是由于对这个主题的普遍困惑 :)
让我稍微绕一下路,希望我能有所帮助。首先,一个类比 - 想象一下你正在尝试在城市中寻找一栋房子。想象每栋房子都被赋予了一个独特的数字 - 你可以想象房子的数量很快就会变得非常庞大和令人困惑。现在想象一下你引入了街道的概念 - 房屋号码现在变得更加可管理,因为你已经将它们分成了好的块。所以:街道=页面号码,房屋号码=偏移地址。

拥有虚拟内存页的整个目的是允许计算机将内存划分为可管理的块,并且不浪费太多内存。将其划分为块(页面)允许对访问,分页和其他诸如此类的事物进行细粒度控制。您的页面越小,您浪费的内存就越少(如果进程A需要32k的内存,而您的页面大小为64k,则会产生一些未使用的内存),但对系统的开销越高。

至于为什么页面大小是2的幂,这是由于地址内部不浪费空间。由于计算机基于二进制(目前为止),所以一切都往往归结为2的幂次方。想象一下如果你有基于10的因素的东西。十进制中的10是1010 - 你必须使用4位来保存它,那么为什么不选择完整范围的值:0000-1111(0到15 = 16个值)。

抱歉我有点冗长了 - 我希望这可以引导你朝着正确的方向前进!

谢谢GHC,但我想看的是汇编指令如何查看偏移量。所以ld r2,0x0005是什么样子的。考虑到每个地址的字大小,每个页面大小为4字节。那么在这种情况下,偏移量将是1字节吗? - user1493786
2
在你回复之前,我进行了一些研究,我们使用2的幂次方的原因是,当我们把虚拟地址除以页面大小时,会得到页号和偏移量,因为地址的顶部m位将是页号,而后面n位将是偏移量。如果不是2的幂次方,则需要使用%和/函数来除以虚拟地址以定位页号和偏移量,这会给系统增加负担。 - user1493786
通过页表进行虚拟地址到物理地址的转换还有另一个好处:它可以缓解由于虚拟地址空间碎片化而导致的物理内存浪费。 - Alexey Frunze

22

我喜欢使用GHC类比街道和城市来解释为什么我们需要分页。将内存的字节分组成页面,也使CPU可以处理更大量的内存。

假设给定以下属性:

  • 虚拟地址为32位
  • 页偏移为12位
  • 物理地址为30位
  • RAM为1GiB

下面是我制作的一个图表,展示了如何使用页面号和页面偏移来寻址内存中的特定单元:

enter image description here

有一个由CPU生成的虚拟地址,由虚拟页号(20位)和页面偏移(12位)组成。

还有一个用于虚拟页号到物理页号映射的页面映射表(另外Dirty位显示页面是否已更改/Resident位显示页面是否常驻存储器中),右侧是内存如何被划分成页面(在图表上以蓝色表示)。

虚拟页号通过20个地址位传递给页面映射表。由于页面号以二进制方式传递,因此具有20个地址位意味着页面映射表最多可以有2^20个记录(因为使用20位可以得到2^20个不同的数字)。这也是页面号为什么是2的幂的原因。

使用pagemap,您可以找到映射到请求的虚拟页面编号的物理页面编号,而页面偏移未被更改。有了物理页面编号和页面偏移量,您就有了物理地址。使用页面编号,您可以进入内存中特定的页面,并使用偏移量进入特定的字节单元。(此外,页面偏移定义了页面大小,因为偏移的12位表示我们可以在页面内寻址2^12 = 4096个单元(在图表上用橙色表示))

在绿色区域中,您可以看到一个示例,其中我们请求具有页面偏移量4095的虚拟页面编号2。根据页面映射,虚拟页面编号2映射到物理页面15,这给出了具有物理页面编号15和偏移量4095的物理地址。(通常,虚拟/物理页面编号和页面偏移量将以十六进制显示,但我使用十进制来简化)

PS:

该示例数据摘自此讲座 - https://www.youtube.com/watch?v=3akTtCu_F_k - 它提供了关于虚拟内存的非常好的概述。


1
我有同样的困惑,但如果我理解正确的话,它就像以下这样:2的幂次方情况略微超出了该主题的一般理解。这更像是一种约定,因为我们正在处理二进制值,并需要适当地对位进行划分,以便2的幂次方适当地适用。
例如,如果一个pGe有64k个单词,每个帧有4个单词,则2 ^ x = 64-> x = 6
这意味着每个帧都可以有一个由6个二进制值组成的物理地址,即0或1,其中4个表示帧号。最后一个表示单词在4个单词中的确切位置。
请注意,这里每个帧都不能有5或任何其他值,否则所谓的约定就失败了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接