我经常在微处理器和微控制器范式中听到术语地址空间。我知道地址用于引用物理内存(主)中的特定内存块。
如果我是对的,地址空间是所有这些地址的超集。正确的?
通过使用虚拟内存/分页,我们正在使用辅助存储扩展地址空间。
在这个范例中,页表、页表条目和页目录到底是什么?我知道第一个 p.memory 在逻辑上是分段的,这些段被分成页面。那么究竟什么是页表呢?包含 Pages 的表?什么是页面目录,页面表的超级表?
我经常在微处理器和微控制器范式中听到术语地址空间。我知道地址用于引用物理内存(主)中的特定内存块。
如果我是对的,地址空间是所有这些地址的超集。正确的?
通过使用虚拟内存/分页,我们正在使用辅助存储扩展地址空间。
在这个范例中,页表、页表条目和页目录到底是什么?我知道第一个 p.memory 在逻辑上是分段的,这些段被分成页面。那么究竟什么是页表呢?包含 Pages 的表?什么是页面目录,页面表的超级表?
在 x86 架构中,页目录和页表一起提供了虚拟地址(应用程序使用的内存地址)和物理地址(物理内存硬件中的实际位置)之间的映射。
页面只是一块连续的内存。x86(32 位)支持 3 种大小的页面:4MB、2MB 和 4KB,后者是主流操作系统中最常用的。页表是一个1024 * 32 位条目的数组(方便地放入单个 4KB 页面)。每个条目都指向页面的物理地址。因为单个页表本身无法代表整个地址空间(1024 个条目 * 4KB = 只有 22 位地址空间),所以我们需要一个二级页表:页目录. 页目录还包含 1024 * 32 位条目(同样适合单个页面),每个条目都指向一个页表。我们可以看到现在 1024 * 1024 * 4KB = 32 位,通过这个 3 级结构,我们能够映射整个 4GB 虚拟地址空间。
当 CPU 被要求访问一个虚拟地址时,它使用 10 个最高位 (31:22) 来索引页目录表(其基地址存储在一个特殊寄存器中)。接下来的 10 个最高位 (21:12) 用于索引页目录项指向的页表。最低 12 位(11:0)最终用于索引页表条目所指向的页中的一个字节。
在其他系统中,可能需要更多或更少级别的页表,具体取决于虚拟地址空间的大小和支持的页面大小。例如,具有 4MB 页面的 x86 只需要一个页面目录。在具有 4KB 页面的 64 位模式中,使用 4 级系统:页面映射级别 4 表包含指向多个页面目录之一的条目。
英特尔架构开发人员手册包含有关该主题的更多信息,特别是在第 3 章和第 4 章中。