关于page_address()的实现的问题

时间:2011-05-31 16:03:18

标签: linux-kernel

在具有highmem的x86机器上,当内核想要查询物理帧的内核虚拟地址时,它将使用page_address。它的工作原理取决于是否定义了宏WANT_PAGE_VIRTUAL,它决定void *virtual中是否添加了struct page。如果没有void *virtual,内核将使用哈希表page_address_htable进行转换,这似乎是x86应用的方法。相反,mips和m68k只需要void *virtual(我对此不太确定)。

所以我的问题是,为什么x86更喜欢哈希表到改进的struct page?它带来了哪些好处?

1 个答案:

答案 0 :(得分:6)

由于需要大量的struct page(每页一个!),在结构中添加一个以上的单词是非常昂贵的(或者相反,即使用一个单词缩小结构也会产生很多效益)。在32位体系结构上WANT_PAGE_VIRTUAL特别昂贵 - 没有它,struct page正好是32个字节,这意味着它很好地包含在缓存行等中。

在x86上,哈希查找速度足够快(因为乘法在x86上很快),所以权衡强烈支持使结构页面变小。我猜m68k乘法是足够昂贵的,膨胀结构页面到36字节是值得的。