06-私有文件映射
49.4.1 私有文件映射
私有文件映射最常见的两个用途如下所述。
- 允许多个执行同一个程序或使用同一个共享库的进程共享同样的(只读的)文本段,它是从底层可执行文件或库文件的相应部分映射而来的。
尽管可执行文件的文本段通常是被保护成只允许读取和执行访问(PROT_READ | PROT_EXEC),但在被映射时仍然使用了MAP_PRIVATE而不是MAP_SHARED,这是因为调试器或自修改的程序能够修改程序文本(在修改了内存上的保护信息之后),而这样的变更是不应该发生在底层文件上或影响到其他进程的。
- 映射一个可执行文件或共享库的初始化数据段。这种映射会被处理成私有使得对映射数据段内容的变更不会发生在底层文件上。
mmap()的这两种用法通常对程序是不可见的,因为这些映射是由程序加载器和动态链接器创建的。读者可以在48.5节中给出的/proc/PID/maps的输出中发现这两种映射。
私有文件映射的另一个不太常见的用途是简化程序的文件输入逻辑。这与使用共享文件映射来完成内存映射I/O(下一节将予以介绍)类似,但它只允许文件输入。