Linux 内核代码和数据是否缓存在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缓存实现:物理索引物理标记(PIPT),虚拟索引虚拟标记(VIPT)等

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

问题:

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

  • 如果内核代码只使用物理地址,那么如何在VIPT缓存中缓存代码或数据?CPU是否检测到它正在以最高权限级别运行,缓存是否基于物理地址编制索引

  • 如果内核代码或数据最终被缓存,这真的会有好处吗?我认为运行的大多数代码都是用户空间,因此属于内核的任何代码或数据都会被迅速清除


  • 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寄存器设置为指向这些结构。但是,内核如何知道