我正在学习不同类型的内存管理。我不明白在虚拟地址中有偏移位的意义。还有为什么页面大小是由力量决定的2
?
我的主要困惑是:给我一个在指令中使用偏移量来访问某个虚拟地址的例子?
我的第二个困惑是:通常的说法是,如果逻辑地址的大小是
2^m
并且页面大小是2^n
,那么逻辑地址的高 mn 位指定页号。
我正在学习不同类型的内存管理。我不明白在虚拟地址中有偏移位的意义。还有为什么页面大小是由力量决定的2
?
我的主要困惑是:给我一个在指令中使用偏移量来访问某个虚拟地址的例子?
我的第二个困惑是:通常的说法是,如果逻辑地址的大小是2^m
并且页面大小是2^n
,那么逻辑地址的高 mn 位指定页号。
我认为您的主要和次要混淆是由于对该主题的普遍混淆:)
让我谈谈这个问题,希望我能有所帮助。首先,打个比方——想象一下,你正试图在一个城市中找到一所房子。想象一下,每个房子都有一个唯一的编号——你可以想象房子的数量很快就会变得非常庞大和混乱。现在想象一下,您引入了街道的概念——门牌号现在变得更易于管理,因为您已将它们分组为好块。所以:街道=页码,门牌号=偏移地址。
拥有虚拟内存页面的全部意义在于允许计算机将内存划分为可管理的块,而不会浪费太多。将其划分为块(页面)允许对访问、分页和其他类似的好东西进行精细控制。您的页面越小,您要浪费的内存就越少(如果进程 A 需要 32k 内存,而您的页面大小为 64k,那么您最终会得到一些未使用的内存),但系统开销。
至于为什么页面大小是 2 的幂,这是地址内不浪费空间的原因。由于计算机是基于二进制的(目前),所以一切都倾向于归结为 2 的幂。想象一下,如果你有基于 10 的因子。二进制中的 10 是 1010 - 你必须使用 4 位来保存它,那么为什么不选择可以从 4 位中获得的全部值:0000 - 1111(0 到 15 = 16 个值)。
对不起,我有点胡扯了——我希望这能把你推向正确的方向!
我喜欢 GHC 与街道和城市的类比,即我们为什么需要寻呼。此外,将内存的字节分组为页面允许 CPU 使用更大量的内存。
假设给出以下属性:
这是我制作的一个图表,它显示了如何使用页码和页偏移量来寻址内存中的特定单元:
有一个由 CPU 生成的虚拟地址,由虚拟页号(20 位)和页偏移量(12 位)组成。
还有一个用于虚拟页号到物理页号映射的页面映射(另外,脏位显示页面是否已更改/驻留位显示页面是否驻留在内存中),右侧是内存如何划分为页面(图中蓝色)。
使用 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 - 它很好地概述了虚拟内存。
我也有同样的困惑,但如果我理解正确,那么它就像下面这样:2 case 的力量稍微超出了对该主题的一般理解。这更像是一种约定,因为我们正在处理二进制值,并且需要在位之间进行适当的划分,以使其适合 2 的幂。
例如,如果一个 pGe 有 64k 个字并且每帧有 4 个字,那么 2^x=64 -> x=6
这意味着每个帧可以有一个物理地址,由 6 个二进制值组成,即 0 或 1,其中 4 表示帧号。最后表示单词在 4 中的确切位置。
请注意,这里每帧不能有 5 或任何其他值,否则所谓的约定会失败。