我正在学习不同类型的内存管理。我不明白虚拟地址为什么需要偏移位,以及为什么页大小要设为2
的幂次方。
我的主要困惑是: 请给我一个例子,解释指令中如何使用偏移量来访问某个虚拟地址?
我的第二个困惑是: 通常说法是,如果逻辑地址的大小为
2^m
,而页面大小为2^n
,那么逻辑地址的高位 m-n 位用于指定页号。
我正在学习不同类型的内存管理。我不明白虚拟地址为什么需要偏移位,以及为什么页大小要设为2
的幂次方。
我的主要困惑是: 请给我一个例子,解释指令中如何使用偏移量来访问某个虚拟地址?
我的第二个困惑是:
通常说法是,如果逻辑地址的大小为2^m
,而页面大小为2^n
,那么逻辑地址的高位 m-n 位用于指定页号。
我喜欢使用GHC类比街道和城市来解释为什么我们需要分页。将内存的字节分组成页面,也使CPU可以处理更大量的内存。
假设给定以下属性:
下面是我制作的一个图表,展示了如何使用页面号和页面偏移来寻址内存中的特定单元:
有一个由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 - 它提供了关于虚拟内存的非常好的概述。