在具有highmem的x86机器上,当内核想要查询物理帧的内核虚拟地址时,它将使用page_address
。它的工作原理取决于是否定义了宏WANT_PAGE_VIRTUAL,该宏决定了struct page
中是否添加void *virtual
。如果没有void *virtual
,内核将使用哈希表page_address_htable
来进行转换,这似乎是x86适用的方法。相反,mips 和 m68k 只是采用 void *virtual
(我对此不太确定)。
所以我的问题是,为什么 x86 更喜欢哈希表而不是改进的struct page
?它能带来什么好处?
最佳答案
由于需要大量的struct page
(每一页一个!),因此在结构中再添加一个单词是非常昂贵的(或者相反,将结构缩小一个单词)带来很多好处)。在 32 位架构上,WANT_PAGE_VIRTUAL
特别昂贵——没有它,struct page 正好是 32 字节,这意味着它可以很好地打包到缓存行等中。
在 x86 上,散列查找足够快(因为乘法在 x86 上很快),因此权衡非常有利于使结构页更小。我想在 m68k 上乘法已经足够昂贵了,将结构页膨胀到 36 字节是值得的。
关于linux-kernel - 关于page_address()的实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190353/