有人知道 TLB(L1 和 L2)是否支持在现代 x86_64 微处理器(Intel SandyBridge、AMD Bulldozer)中同时访问多个页面大小?x86 核心管道是否向 MMU 提供有关页面大小的信息?
最好的祝福,
亚历克斯
这不是 TLB 允许什么的问题,而是架构允许什么的问题。该体系结构表明,您可以在同一页面层次结构中混合小 (4k)、大 (2M) 和大 (1G) 页面,方法是PS
将页面目录条目中的位设置在适当的级别。
并非所有级别的 TLB 都必须能够缓存所有大小的页面,但这不应该阻止您混合页面,如果您愿意的话。
现在,在 MMU 之前的 x86 管道中没有任何东西实际上需要有关页面大小的数据。这都是在页面层次结构本身中编码的。
关于页面拆分,如果您在 address 有一个页面边界x
,并且您有一个开始于x - 1
超过 1 字节宽的内存访问,它将访问两个页面。即使两个页面的大小不同,这也将起作用。
TLB 通常分为两部分:代码和数据。这些中的每一个都可以分为多个级别,但通常是 L1,也可能是 L2。每个级别可能支持单一页面大小或混合页面大小。
例如在我的处理器上,我有一个用于 2mb/4mb 页面的混合 I-L1 TLB,一个用于 2mb/4mb 页面的 D-L1 TLB,混合,一个用于 4kb 页面的 I-L1 TLB,一个用于 4kb 页面的 D-L1 TLB最后是 4kb 页面的 D-L2 TLB。
当 TLB 支持混合页面时,TLB 存储与特定虚拟地址标签相关联的页面大小。
当 TLB 级别的每个页面大小有多个单独的缓存时,由于页面大小未知,因此查找是并行执行的。
在任何一种情况下,如果 L1 TLB 未命中,则将在尝试页表遍历之前检查 L2。
既然细节已经解决了,我们终于可以回答你的问题了。您可以同时使用多个页面大小,但是它们永远不能重叠(操作系统不会让您在同一位置映射 2 个虚拟页面)。事实上,内核在内部使用多种页面大小来处理各种事情。
根据操作系统,在用户空间进程中使用多个页面大小可能很容易,也可能很痛苦。有关这方面的更多详细信息,请参阅 Linux Huge page support 和 Windows Large Pages support。其他操作系统将在其文档中对此进行详细说明。