Bee*_*ope 7 linux mmap linux-kernel memory-management
在现代 64 位 x86 Linux 上,内核端如何设置虚拟页面和物理页面之间的映射?在用户端,您可以mmap从页面缓存中读取页面,这会将 4K 页面直接映射到用户空间 - 但我对页面在内核端的映射方式很感兴趣。
它是使用“整个 ram 身份映射”还是其他什么?整个 ram 身份映射通常使用 1GB 页面吗?
在现代 64 位 x86 Linux 上?
是的。它调用kmap()or kmap_atomic(),但在 x86-64 上这些将始终使用身份映射。x86-32 有它的具体定义,但我认为 x86-64 在include/linux/highmem.h中使用通用定义。
是的,身份映射使用 1GB 大页面。
我通过查看PIO 代码找到了 kmap_atomic() 。[*]
最后,当 read() / write() 将数据从页面缓存复制到页面缓存时:
再次generic_file_buffered_read -> copy_page_to_iter -> kmap_atomic() 。
[*] 我查看了 PIO,因为我意识到当对页面缓存执行 DMA 或从页面缓存执行 DMA 时,内核可以避免使用任何映射。内核可以解析物理地址并将其传递给硬件:-)。(受 IOMMU 约束)。尽管如此,如果内核想要首先对数据进行校验和或加密,则需要映射。