Linux 内核代码和数据是否缓存在CPU缓存中?
理论: 根据访问缓存位置的方法,有多种类型的CPU缓存实现:物理索引物理标记(PIPT),虚拟索引虚拟标记(VIPT)等 在具有VIPT缓存的情况下,为了读取缓存位置,需要物理地址以及虚拟地址。对于用户进程来说,这是直截了当的:进程在其代码中使用虚拟地址,这些地址被转换为物理地址(希望通过在TLB缓存中找到它们),CPU可以使用这两个地址计算缓存位置。问题是关于内核代码 问题:Linux 内核代码和数据是否缓存在CPU缓存中?,linux,performance,linux-kernel,operating-system,computer-architecture,Linux,Performance,Linux Kernel,Operating System,Computer Architecture,理论: 根据访问缓存位置的方法,有多种类型的CPU缓存实现:物理索引物理标记(PIPT),虚拟索引虚拟标记(VIPT)等 在具有VIPT缓存的情况下,为了读取缓存位置,需要物理地址以及虚拟地址。对于用户进程来说,这是直截了当的:进程在其代码中使用虚拟地址,这些地址被转换为物理地址(希望通过在TLB缓存中找到它们),CPU可以使用这两个地址计算缓存位置。问题是关于内核代码 问题: 当内核代码运行时,它使用物理地址还是虚拟地址?内核是将VA转换为PA(或至少管理转换)的内核。我还知道,进程不能使用整
CPU不知道内核是什么。它只是像往常一样应用翻译。内核(几乎)也不关心CPU缓存 CPU按物理位置缓存缓存。所有这些对任何运行的软件都是透明的(除非软件通过向硬件询问有关缓存等的问题来明确打破抽象) 内核使用虚拟地址
缓存内核代码和数据非常重要。在某些BIOS中,您可以禁用CPU缓存。当你这样做时,启动需要几个小时。即使内核只占用CPU时间的1%,时间也会被放大到99%。CPU不知道内核是什么。它只是像往常一样应用翻译。内核(几乎)也不关心CPU缓存 CPU按物理位置缓存缓存。所有这些对任何运行的软件都是透明的(除非软件通过向硬件询问有关缓存等的问题来明确打破抽象) 内核使用虚拟地址
缓存内核代码和数据非常重要。在某些BIOS中,您可以禁用CPU缓存。当你这样做时,启动需要几个小时。即使内核只占用CPU时间的1%,时间也会被放大到99%。CPU不知道内核是什么。它只是像往常一样应用翻译。内核(几乎)也不关心CPU缓存 CPU按物理位置缓存缓存。所有这些对任何运行的软件都是透明的(除非软件通过向硬件询问有关缓存等的问题来明确打破抽象) 内核使用虚拟地址
缓存内核代码和数据非常重要。在某些BIOS中,您可以禁用CPU缓存。当你这样做时,启动需要几个小时。即使内核只占用CPU时间的1%,时间也会被放大到99%。CPU不知道内核是什么。它只是像往常一样应用翻译。内核(几乎)也不关心CPU缓存 CPU按物理位置缓存缓存。所有这些对任何运行的软件都是透明的(除非软件通过向硬件询问有关缓存等的问题来明确打破抽象) 内核使用虚拟地址
缓存内核代码和数据非常重要。在某些BIOS中,您可以禁用CPU缓存。当你这样做时,启动需要几个小时。即使内核只占用CPU时间的1%,该时间也会被放大到99%。当内核负责配置虚拟到物理地址的转换时,实际的转换是在硬件中执行的,而不是在内核中。因此,在早期启动阶段或在处理硬件外围设备的特殊位置之后,内核通常可以利用虚拟地址,并享受由此产生的灵活性。@ChrisStratton我的理解是,内核是创建包含所有VA到PA转换的页表结构的人,当进程运行时,它将CR3寄存器设置为指向这些结构。然而,内核如何知道将数据存储在哪里。它需要一个PA地址。。。对吧?@ChrisStratton嗯。。。因此,基本上内核只使用虚拟地址,它们仅限于总VA空间的一个子集(如>0x7FFFFF…?)对吗?@VAndrei分配给内核的确切虚拟地址空间取决于arch,有时取决于内核配置。如果您有一个32位x86并且有
VMSPLIT\u 3G=y
,那么内核代码将驻留在0xc000000
到0xffffff
中。虽然内核负责配置虚拟到物理地址的转换,但实际的转换是在硬件中执行的,而不是在内核中。因此,在早期启动阶段或在处理硬件外围设备的特殊位置之后,内核通常可以利用虚拟地址,并享受由此产生的灵活性。@ChrisStratton我的理解是,内核是创建包含所有VA到PA转换的页表结构的人,当进程运行时,它将CR3寄存器设置为指向这些结构。但是,内核如何知道