页码和偏移量

use*_*786 16 operating-system page-numbering page-size os161

我正在学习不同类型的内存管理.我不明白在虚拟地址中有一个偏移位.还有为什么页面大小的功效2

  • 我的主要困惑是:给我一个示例,说明在指令中使用偏移来访问某个虚拟地址?

  • 我的第二个困惑是:通常的说法是,如果逻辑地址的大小是2^m和页面大小是2^n,则逻辑地址的高位mn位指定页码.

GHC*_*GHC 29

我认为你的主要和次要混淆是由于对这个主题的一般混淆:)

让我谈谈这一点,希望我可以得到一些帮助.首先,一个类比 - 想象一下,你正试图找到一个城市的房子.想象一下,每个房子都有一个独特的数字 - 你可以想象房屋的数量会很快变得非常庞大和令人困惑.现在想象一下,你介绍了街道的概念 - 房屋号码现在变得更加可管理,因为你把它们分成了很好的块.所以:Streets =页码,门牌号=偏移地址.

拥有虚拟内存页面的重点是允许计算机将内存刻录成可管理的块,而不是浪费太多.将其分成块(页面)可以精确控制访问,分页和其他类似的东西.您的页面越小,您将浪费的内存越少(如果进程A需要32k内存,而您的页面大小为64k,那么最终会得到一些未使用的内存),但是系统上的开销.

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

对不起,我有点胡扯了 - 我希望这能推动你朝着正确的方向前进!

  • 在我回复之前我做了一些研究,我们使用2的幂,是因为当我们按页面大小划分虚拟地址时,你将获得pagennumber和offset,就像地址的前m位一样将是页码,后面的n位将是偏移量.如果它不是2的幂,则划分虚拟地址以定位页码和偏移量需要%和/ function,这会增加系统的开销. (2认同)

Vik*_*nov 5

我喜欢GHC与街道和城市的类比,以了解我们为什么需要分页。同样,将内存的字节分组到页面中也可以使CPU占用更多的内存。

假设给出以下属性:

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

这是我制作的一个图,它显示了页码和页偏移量如何用于寻址内存中的特定单元:

在此处输入图片说明

有一个虚拟地址,由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-它提供了非常好的虚拟内存概述。