我试图了解linux内核如何处理TLB未命中 . 具体来说,我知道页表行走发生在 mm/memory.c
mm/memory.c
中,但是当TLB未命中时,如何调用follow_page . 如何将follow_page的返回值( struct page
)传递回硬件?有人可以说明TLB未命中处理的调用图,从硬件引发TLB Miss异常到调用 follow_page
时是什么时候?
我在内核代码http://lxr.linux.no/linux+v3.4.4/+search=follow_page中搜索了 follow_page
,但结果似乎没什么帮助 . 为了清楚起见,我们可以说硬件是x86_64 .
2 回答
我发现对于大多数x86架构,当TLB未命中时,硬件会执行页面遍历 . 在TLB未命中期间,不会调用
mm/memory.c
中的软件页面遍历代码follow_page
. 因此,根据我的理解,在Linux内核中没有用于处理TLB未命中的调用图 .正如您所注意到的那样,自80386以来,英特尔处理器的MMU具有用于填充转换后备缓冲区的硬件分辨率 . 这就解释了为什么这种架构的页面表具有如此严格的结构 . 在这种架构中,有许多地方需要沿着页面表格走(如
follow_page
),尤其是在handle_mm_fault
中,尽管通常可以期待更具体的情况并且放弃大多数测试 .