【发布时间】:2015-05-26 14:41:04
【问题描述】:
理论:
有多种类型的 CPU 缓存实现,具体取决于访问缓存位置的方法:物理索引物理标记 (PIPT)、虚拟索引虚拟标记 (VIPT)等。
如果有VIPT 缓存,为了读取缓存位置,除了虚拟地址,还需要物理地址强>。对于用户进程,这是直截了当的:进程在其代码中使用虚拟地址,将其转换为物理地址(希望通过在 TLB 缓存中找到它们),并且 CPU 可以使用这 2 个地址计算缓存位置。问题是关于内核代码的。
问题:
内核代码运行时是使用物理地址还是虚拟地址?内核是从 VA 转换为 PA(或至少管理转换)的内核。我也知道一个进程不能使用整个 VA 空间,因为它的很大一部分是为内核保留的。那么内核是否有可能使用 VA 但仅在 0x7FFFF... 到 0xFFFFFF 空间中?
如果内核代码只使用物理地址,如何将代码或数据缓存在 VIPT 缓存中? CPU 是否检测到它以最高权限级别运行并根据物理地址进行缓存索引?
如果内核代码或数据最终被缓存,是否真的有益?我认为运行的大部分代码都是用户空间的,因此任何属于内核的代码或数据都会被迅速清除。
【问题讨论】:
-
虽然内核负责配置虚拟到物理地址的转换,但实际的转换是在硬件中执行的,而不是在内核中。因此,在早期启动阶段之后或在处理硬件外围设备的特殊地方,内核通常可以利用虚拟地址并享受由此产生的灵活性。
-
@ChrisStratton 我的理解是内核是创建具有所有 VA 到 PA 转换的页表结构的人,并且当进程运行时,它会将 CR3 寄存器设置为指向这些结构。但是,内核如何知道将数据存储在哪里。它需要一个 PA 地址……对吗?
-
@ChrisStratton 嗯...所以基本上内核只使用虚拟地址,它们仅限于总 VA 空间的子集(例如 > 0x7FFFFF...?)是这样吗?
-
@VAndrei 分配给内核的确切虚拟地址空间取决于架构,有时取决于内核配置。如果你有一个 32 位 x86 并且有
VMSPLIT_3G=y,那么内核代码将驻留在0XC0000000到0xFFFFFFFF。
标签: linux performance linux-kernel operating-system computer-architecture