内核代码和数据是否缓存在 CPU 缓存中?

Do kernel code and data get cached in the CPU caches?

理论:

有多种类型的 CPU 缓存实现,具体取决于访问缓存位置的方法:物理索引物理标记 (PIPT)、虚拟索引虚拟标记 ( VIPT), 等等

如果有 VIPT 缓存,为了读取缓存位置,需要 物理地址 虚拟地址。对于用户进程,这是直截了当的:该进程在其代码中使用虚拟地址,这些虚拟地址被转换为物理地址(希望通过在 TLB 缓存中找到它们)并且使用这 2 个地址 CPU 可以计算缓存位置.问题是关于内核代码的。

问题:

  1. 当内核代码运行时它使用物理地址还是虚拟地址?内核是从 VA 转换为 PA(或至少管理转换)的内核。我也知道一个进程不能使用整个 VA space 因为它的很大一部分是为内核保留的。那么内核有没有可能使用 VA 但只在 0x7FFFF... 到 0xFFFFFF space?

  2. 如果内核代码仅使用物理地址,那么代码或数据如何缓存在 VIPT 缓存中? CPU 是否检测到它处于最高权限级别 运行 并根据物理地址进行缓存索引?

  3. 如果内核代码或数据最后缓存起来,是不是真的有好处?我认为大多数代码 运行 是用户 space 的代码,因此属于内核的任何代码或数据都会被迅速清除。

CPU不知道内核是什么。它只是像往常一样应用翻译。内核(几乎)也不关心 CPU 缓存。

CPU 按物理位置缓存缓存。所有这些对任何运行的软件都是透明的(除非软件通过向硬件询问有关缓存等的一些问题来明确打破抽象)。

内核使用虚拟地址。

缓存内核代码和数据非常重要。在某些 BIOS 中,您可以禁用 CPU 缓存。当您这样做时,启动需要数小时。即使内核只占用 CPU 时间的 1%,该时间也会被放大到 99%。