【问题标题】:Do kernel code and data get cached in the CPU caches?内核代码和数据是否缓存在 CPU 缓存中?
【发布时间】:2015-05-26 14:41:04
【问题描述】:

理论:

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

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

问题:

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

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

  3. 如果内核代码或数据最终被缓存,是否真的有益?我认为运行的大部分代码都是用户空间的,因此任何属于内核的代码或数据都会被迅速清除。

【问题讨论】:

  • 虽然内核负责配置虚拟到物理地址的转换,但实际的转换是在硬件中执行的,而不是在内核中。因此,在早期启动阶段之后或在处理硬件外围设备的特殊地方,内核通常可以利用虚拟地址并享受由此产生的灵活性。
  • @ChrisStratton 我的理解是内核是创建具有所有 VA 到 PA 转换的页表结构的人,并且当进程运行时,它会将 CR3 寄存器设置为指向这些结构。但是,内核如何知道将数据存储在哪里。它需要一个 PA 地址……对吗?
  • @ChrisStratton 嗯...所以基本上内核只使用虚拟地址,它们仅限于总 VA 空间的子集(例如 > 0x7FFFFF...?)是这样吗?
  • @VAndrei 分配给内核的确切虚拟地址空间取决于架构,有时取决于内核配置。如果你有一个 32 位 x86 并且有VMSPLIT_3G=y,那么内核代码将驻留在0XC00000000xFFFFFFFF

标签: linux performance linux-kernel operating-system computer-architecture


【解决方案1】:

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

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

内核使用虚拟地址。

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

【讨论】:

  • 实际上内核同时使用:物理地址和虚拟地址。这取决于拱门和运行阶段。正如我们所说的带有 VIPT 缓存的 ARM,内核担心刷新 TLB 和努力应对缓存别名。
  • 是的,没错。我关心这里 99% 的执行。物理地址从不用于加载和存储指令。它们在配置硬件时使用。
  • CPU确实知道内核是什么,内核确实知道物理地址(实际上,它拥有映射),以及任何像样的内核在某种程度上关注缓存隐含。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多