在现代 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 大页面。
我通过查看找到了 kmap_atomic()PIO代码.[*]
最后,当 read() / write() 将数据从页面缓存复制到页面缓存时:
generic_file_buffered_read->复制页面到迭代器-> 再次kmap_atomic()。
[*] 我查看了 PIO,因为我意识到当对页面缓存执行 DMA 或从页面缓存执行 DMA 时,内核可以避免使用任何映射。内核可以解析物理地址并将其传递给硬件:-)。 (受 IOMMU 约束)。尽管如此,如果内核想要首先对数据进行校验和或加密,则需要映射。