前言
最近在学习GNU/Linux内核,看到mmap的时候书上说:
mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存、读写大文件、链接动态库文件,还是多进程间共享内存,都可以看到mmap/munmap的身影。
这句话说的很正确,虽然我们日常没有直接使用mmap,但是其实我们都间接地使用了mmap/mumap函数。
举个例子,我们使用动态链接库的时候,我们都知道,动态链接不会把动态库中的代码整合到目标文件中,相反,动态库跟目标文件独立。
那为什么运行时,程序能够获得指定的符号链接?这正是mmap的力量,程序运行时,他将保存在物理内存的动态库的内容(如果物理内存中没有,则先加载如内存)映射到自身的进程地址空间,这样符号所对应的指令数据便存在了。
(通过ldd可获取所依赖的动态库,Linux怎么获取到的,我怀疑跟ELF文件格式有关,待解答)
mmap
mmap是内存映射文件的方法
mmap将一个文件或者其它对象映射进内存。mmap在用户空间映射调用系统中作用很大。
mmap()必须以PAGE_SIZE为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。
头文件
<sys mman.h>
函数原型
voi