linux-kernel - 关于page_address()的实现的问题

标签 linux-kernel

在具有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/

相关文章:

linux-kernel - Linux如何确定模块init调用的顺序?

linux - 将 `struct file` 传递给另一个进程

linux - `execve()` 是否设置寄存器来调用动态链接器或要执行的可执行文件?

java - 正则表达式捕获一定范围内的内核版本

c - 使用 -save-temps 构建内核 - 这些 9 MB 的 *.i 文件是全部吗?

控制台上的 linux kprint 消息

memory-management - 关于 "__GFP_COMP"的用法?

linux - 如何在 arch linux 3.12 内核中启用审计框架?

c - 如何修复 copy_from_user 不起作用?

linux-kernel - 用于生产服务器的 Systemtap