在 Linux 开发中,处理文件通常有两种非常常见的方式:
一种是传统的 open + read + write,另一种则是 mmap 内存映射。
很多人对 mmap 的理解停留在一句话:
mmap 很快,因为它是“零拷贝”。
这句话不能说完全错误,但并不严谨。
mmap 并不是让磁盘数据凭空出现在用户程序中,也不是完全没有任何数据复制。它真正改变的是:
文件数据进入内存后,用户程序不再需要通过 read() 再把数据从内核页缓存复制到自己的用户缓冲区,而是直接将文件页映射到进程虚拟地址空间。
换句话说:
传统 read() 的思路是:
内核帮你把数据拿出来,再复制一份交给你。
而 mmap 的思路是:
数据不用搬给你,直接给你一张“访问这块内存的地址”。
这看似只是一次 API 的区别,背后实际上涉及 Linux 的页缓存、虚拟内存、页表、缺页异常以及 MMU 地址转换机制。
一、传统 read:数据为什么要“搬两次”?
先来看最普通的文件读取:



