理论值:
有多种类型的CPU缓存实现,具体取决于访问缓存位置的方法:物理索引物理标记( PIPT ),虚拟索引虚拟标记( VIPT )等等。
如果有 VIPT缓存,为了读取缓存位置,虚拟地址需要物理地址 STRONG>。对于用户进程,这是直截了当的:该进程在其代码中使用虚拟地址,将其转换为物理地址(希望通过在TLB缓存中找到它们),并使用2个地址,CPU可以计算缓存位置。问题是内核代码。
问题:
内核代码运行时是否使用物理或虚拟地址?内核是从VA转换为PA(或至少管理转换)的内核。我也知道一个进程不能使用整个VA空间,因为它的一大部分是为内核保留的。那么内核可能使用VA但仅在0x7FFFF ...到0xFFFFFF空间?
如果内核代码仅使用物理地址,那么如何在VIPT缓存中缓存代码或数据? CPU是否检测到它以最高权限级别运行并根据物理地址进行缓存索引?
如果内核代码或数据最终被缓存,它真的有益吗?我认为大多数运行的代码都是用户空间,因此任何属于内核的代码或数据都会被快速刷新。
答案 0 :(得分:3)
CPU不知道内核是什么。它只是像往常一样应用翻译。内核(几乎)也不关心CPU缓存。
CPU按物理位置缓存缓存。所有这些对任何运行的软件都是透明的(除非软件通过向硬件询问有关缓存等问题而明确地破坏了抽象)。
内核使用虚拟地址。
缓存内核代码和数据非常重要。在某些BIOS中,您可以禁用CPU缓存。当你这样做时,启动需要几个小时。即使内核占用CPU时间的1%,时间也会被放大到99%。