前言
最近在学习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>
函数原型
void* mmap(void* addr, size_t length,int prot,int flags,int fd,off_t offset); int munmap(void* start,size_t length);
- addr: 用于指定映射到进程地址的起始地址,为了应用程序的可移植性,一般设为nullptr;

本文详细介绍了Linux下如何使用mmap进行内存映射,并结合shm_open探讨了共享内存的创建和使用。通过实例展示了如何实现进程间通信,强调了共享内存不自带同步机制,需要借助信号量解决。文章还提到了 shm_open 与 open 的区别,以及在实践中可能遇到的问题和解决方法。
最低0.47元/天 解锁文章
384

被折叠的 条评论
为什么被折叠?



