1

在 Linux 操作系统中,启用页表后,内核只会将属于内核空间的 PTE 映射一次,而不再重新映射它们?此操作与用户空间中的 PTE 相反,每次进程切换发生时都需要重新映射?

所以,我想知道内核和用户空间中 PTE 管理的区别。

这个问题是问题的扩展部分: 引导期间 Linux 内核空间中的页表

4

2 回答 2

3

每个进程都有自己的页表(尽管描述内核地址空间的部分是相同的并且是共享的。)

在进程切换时,CPU 被告知新表的地址(这是一个写入 x86 CPU 上的 CR3 寄存器的单个指针)。

于 2013-05-24T07:18:10.813 回答
0

所以,我想知道内核和用户空间中 PTE 管理的区别。

看到这些相关的问题,

对此有很多优化,

每个任务都有不同的PGD,但PTE值可能在进程之间共享,因此每个进程可以映射相同的大块内存;仅更新顶级目录(x86 上的 CR3,ARM 上的 TTB)。

此外,许多 CPU 具有 TLB 和缓存。这些需要通过内存映射来维护。一些缓存是 VIVT、VIPT 和 PIPT。如果PGD 和/或 PTE 发生变化,前两个必须进行一些缓存刷新。CPU 通常会支持进程、线程或域 ID。操作系统只需要在上下文切换期间切换此寄存器。硬件缓存和 TLB 条目必须包含带有进程、线程或域 id 的标签。这是每个架构的实现细节。

因此,当顶级页面寄存器发生变化时,可能需要刷新 TLB。发生这种情况时,CPU 可能会刷新整个 TLB。但是,这对于保持映射的页面是不利的。

此外,内存的子部分可以相同。加载器或其他库可用于mmap创建进程之间相似的代码。这个通用代码可能不需要在页表级别交换,具体取决于架构、加载器和 Linux 版本。它当然可以有一个虚拟别名,然后它需要被交换。

答案的最后一点;内核页面总是被映射的。只有非抢占式操作系统无法映射内核,但这没有什么意义,因为每个进程都想调用内核。我猜微内核范式允许设备驱动程序在不使用时卸载。Linux 使用模块加载来处理这个问题。

于 2022-01-26T17:26:11.597 回答