在 64 位 x86 架构上,页面缓存如何映射到内核中?

在 64 位 x86 架构上,页面缓存如何映射到内核中?

在现代 64 位 x86 Linux 上,内核端如何设置虚拟页面和物理页面之间的映射?在用户端,您可以mmap从页面缓存中获取页面,这会将 4K 页面直接映射到用户空间 - 但我对页面在内核端的映射方式感兴趣。

它是否使用“整个内存身份映射”或其他什么?整个 ram 身份映射通常使用 1GB 页面吗?

答案1

在现代 64 位 x86 Linux 上?

是的。它调用kmap()or kmap_atomic(),但在 x86-64 上这些将始终使用身份映射。 x86-32 有它的具体定义,但我认为 x86-64 使用通用定义包括/linux/highmem.h

是的,身份映射使用 1GB 大页面。

LWN 文章提到了 kmap_atomic

我通过查看找到了 kmap_atomic()PIO代码.[*]

最后,当 read() / write() 将数据从页面缓存复制到页面缓存时:

generic_file_buffered_read->复制页面到迭代器-> 再次kmap_atomic()。


[*] 我查看了 PIO,因为我意识到当对页面缓存执行 DMA 或从页面缓存执行 DMA 时,内核可以避免使用任何映射。内核可以解析物理地址并将其传递给硬件:-)。 (受 IOMMU 约束)。尽管如此,如果内核想要首先对数据进行校验和或加密,则需要映射。

相关内容