Operating system 页码和偏移量

Operating system 页码和偏移量,operating-system,page-numbering,page-size,os161,Operating System,Page Numbering,Page Size,Os161,我正在学习不同类型的内存管理。我不明白在虚拟地址中有偏移位的意义。还有为什么页面大小是由2的幂决定的 我的主要困惑是: 请给出一个在指令中使用偏移量来访问某个虚拟地址的示例 我的第二个困惑是: 通常的说法是,如果逻辑地址的大小为2^m且页面大小为2^n,则逻辑地址的高阶m-n位指定页码 我认为你的主要和次要困惑是由于对这个主题的普遍困惑:)让我谈谈这个问题,希望我能有所帮助。首先,打个比方——想象一下你正试图在一座城市中找到一所房子。想象一下,每个房子都有一个唯一的数字——你可以想象,房子的数

我正在学习不同类型的内存管理。我不明白在虚拟地址中有偏移位的意义。还有为什么页面大小是由
2
的幂决定的

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

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


    • 我认为你的主要和次要困惑是由于对这个主题的普遍困惑:)

      让我谈谈这个问题,希望我能有所帮助。首先,打个比方——想象一下你正试图在一座城市中找到一所房子。想象一下,每个房子都有一个唯一的数字——你可以想象,房子的数量很快就会变得非常庞大和混乱。现在想象一下,你引入了街道的概念——随着你把门牌号码分成一个很好的块,门牌号码现在变得更易于管理了。所以:街道=页码,门牌号=偏移地址。

      拥有虚拟内存页的全部意义在于允许计算机将内存分割成可管理的块,而不是浪费太多内存。将它分割成块(页面)允许对访问、分页和其他类似的事情进行细粒度控制。页面越小,浪费的内存就越少(如果进程A需要32k内存,而页面大小为64k,则会得到一些未使用的内存),但系统开销越高。

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


      对不起,我说得有点含糊不清-我希望这能把你推向正确的方向

      我也有同样的困惑,但如果我理解正确的话,那就如下所示:2案例的力量稍微超出了对主题的一般理解。这更像是一种约定,因为我们处理的是二进制值,需要在2的幂适合的位之间进行适当的划分

      例如,如果pGe有64k个字,且每帧有4个字,则2^x=64 ->x=6

      这意味着每个帧可以有一个由6个二进制值组成的物理地址,即0或1,其中4表示帧编号。最后表示单词在4个单词中的确切位置


      请注意,这里每个帧不能有5或任何其他值,或者所谓的约定失败。

      我喜欢GHC与街道和城市的类比,以解释我们为什么需要分页。此外,将内存的字节分组到页面中还允许CPU使用更大的内存量

      假设给定以下属性:

      • 虚拟地址是32位
      • 页偏移量为12位
      • 物理地址为30位
      • 内存是1GB
      下面是我制作的一个digram,它显示了如何使用页码和页偏移量来寻址内存中的特定单元:

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

      此外,还有一个用于虚拟页码到物理页码映射的页面映射(另外,脏位显示页面是否已更改/驻留位显示页面是否驻留在内存中),右边是内存如何划分为页面(图上为蓝色)

      虚拟页码使用20个地址位传递给pagemap。由于页码是以二进制形式传递的,具有20个地址位意味着pagemap最多可以有2^20条记录(因为使用20位可以获得2^20个不同的数字),这也是页码是2的幂的原因

      因此,使用pagemap可以找到哪个物理页码映射到请求的虚拟页码,页面偏移量不会改变。有了物理页码和页偏移量,就有了物理地址。使用页码可以转到内存的特定页面,使用偏移量可以转到特定字节单元。(页偏移量也定义了页大小,因为偏移量的12位意味着我们可以在一页中寻址2^12=4096个单元格(图中的橙色)

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

      附言:


      示例数据取自本节课--它对虚拟内存有很好的概述。

      谢谢GHC,但我想看的是汇编指令如何看待偏移量。ld r2,0x0005也是如此。假设每个地址都是字大小,每个页面大小是4字节。在这种情况下,偏移量是1字节。在回复之前,我做了一些研究,我们使用2的幂的原因是,当我们将虚拟地址除以页面大小时,u将得到pagennumber和偏移量,因为地址的前m位将是页码,后面的n位将是偏移量。如果不是二的幂,则分割虚拟地址以定位页码和偏移量需要%和/函数,这会增加系统开销。通过页表进行虚拟地址到物理地址的转换还有另一个好处:它可以减少虚拟地址空间碎片造成的物理内存浪费。您可以