操作系统:页表中的页表项
页表是操作系统用于跟踪进程使用的虚拟地址与系统内存中相应物理地址之间映射的数据结构。
页表项(Page Table Entry,PTE)是页表中的一个条目,用于存储有关特定内存页的信息。每个页表项包含的信息包括内存中页的物理地址、该页是否在内存中、是否可写以及其他访问权限。
页表项的大小和格式可能会根据系统的架构和使用的操作系统而有所不同。通常,一个页表项包含足够的信息,以便操作系统能够高效管理内存,并保护系统免于恶意或意外访问内存。
页表中的页表项数量取决于进程使用的虚拟地址空间的大小和系统使用的内存页的大小。例如,如果进程的虚拟地址空间为 32 位,并且系统使用 4KB 的页,那么页表将有 2 20 2^{20} 220 (即一百万)个条目,每个条目大小为 4B。
在现代虚拟地址空间系统中,如 64位系统,页表可能变得非常大,导致性能问题。为了解决这个问题,一些系统使用分层页表,将页表划分为较小的表,每个小表指向一个较大的表。这种方式允许更高效的内存管理和更快的页表项访问。
页表项中存储的信息
- 帧号:表示当前查找的页所在的帧号。所需的位数取决于帧的数量。帧位也称为地址翻译位。
帧的位数 = 物理内存大小 / 帧大小
-
存在/不存在位:表示所查找的特定页是存在还是不存在。如果不存在,则称为缺页。如果相应的页不在内存中,则置为0。该位用于通过操作系统控制缺页,以支持虚拟内存。有时,这个位也称为有效/无效位。
-
保护位:表示希望对该页进行何种保护。这些位用于保护页帧(读、写等)。
-
引用位:表示在上一个时钟周期内是否引用了该页。当页被访问时,硬件将其置为1。
-
缓存启用/禁用:有时我们需要最新的数据。假设用户正在从键盘输入信息,程序应该根据用户提供的输入运行。在这种情况下,信息将进入主内存。因此,主内存包含用户输入的最新信息。如果将该页放入缓存,则缓存将显示旧信息。因此,当需要新鲜数据时,我们不希望使用缓存或多级内存。CPU最近一级和用户最近一级的信息可能不同。我们希望信息一致,即CPU能尽快看到用户提供的信息。这就是我们希望禁用缓存的原因。因此,该位用于启用或禁用页的缓存。
-
修改位:表示该页是否已被修改。修改意味着有时可能会在页面上写入内容。如果一个页面被修改,那么无论何时需要用其他页面替换该页面,修改过的信息应当保存在硬盘上或需要写回或保存。当对页面进行写访问时,硬件将其置为1,以避免在交换出时写入。有时,这个修改位也被称为脏位。
在虚拟内存系统中使用页表的优势
- 高效使用内存:虚拟内存允许操作系统仅分配进程所需的物理内存量,减少内存浪费并提高整体系统性能。
- 保护:页表允许操作系统控制对内存的访问,保护敏感数据免于未经授权的访问。每个页表项可以配置访问权限,如只读或无访问权限,以防止意外或恶意的内存修改。
- 灵活性:虚拟内存允许多个进程共享相同的物理内存空间,增加系统的灵活性并允许更好的资源利用。
- 地址翻译:页表提供将进程使用的虚拟地址翻译为内存中物理地址的机制,允许高效使用内存并简化内存管理。
- 分层设计:一些系统使用分层页表,这种方式提供了更高效的方法来管理大虚拟地址空间。分层页表将页表分为较小的表,每个小表指向一个较大的表,允许更快的页表项访问并减少页表的整体大小。