mmap(存储映射)
1、头文件:#include <sys/mman.h>
2、函数原型:void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
3、函数形参:addr:指定文件应被映射到的进程空间的起始地址;
length:共享内存映射的有效文件大小(字节数),须<=文件的实际大小;
prot:指定共享内存的访问权限(读写属性),不能与文件的打开模式冲突;
flags:指定映射对象的共享属性,映射选项和映射页是否可以共享;
fd:用于创建共享内存映射区的文件描述符,一般由open()返回;
offset:偏移量,表示被映射对象内容的起点,一般设为0,表从头开始。
注:(1)addr一般被指定一个空指针(NULL),表示让系统自动分配。
(2)如果MAP_ANONYMOUS被设定,fd值应为-1,表示进行匿名映射。
(3)prot可选值域:PROT_READ(可读);PROT_WRITE(可写);
PROT_EXEC(可执行);PROT_NONE(不可访问,此值不常用)。
(4)flags两个值:MAP_SHARED(权限为共享)、 MAP_PRIVATE(权限为私有)。
4、函数返回值:成功执行时,返回最后文件映射区的首地址(指针)。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],错误存于errno。
5、功能描述:创建共享内存映射。
(memory map)地址的映射,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写这页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,使得进程间通过映射同一普通文件实现共享内存。(创建新的vm_area_struct结构,并将其与文件物理磁盘地址相连)
6、注意事项:
(1)用于创建映射区的文件大小为0,实际指定非0大小创建映射区,出“总线错误”。
(2)用于创建映射区的文件大小为0,实际指定为0大小创建映射区,出“无效参数”。
(3)用于创建映射区的文件读写属性为只读,映射区为读写,出“无效参数”
(4)创建映射区,需要read权限,当访问权限指定为“共享”,mmap的读写权限应<=文件的open权限,只写不行。
(5)文件描述符fd,在mmap创建映射区完成即可关闭,后续访问文件用地址访问。
(6)offset必须为4096整数倍(MMU映射最小单位为4k – 一页)。
(7)对申请的内存,不能越界访问。
(8)mmap用于释放的地址必须为mmap申请返回的地址。
(9)映射区访问权限为“私有”,对内存所作修改,只对内存有效,不会反应到物理磁盘上。
(10)映射区访问权限为“私有”,只需要open文件时有读权限,用于创建映射区即可。
7、优点:系统调用-保护内核。
8、缺点:开销比较大。
9、保险调用方式:
fd = open(“”,O_RDWR);
……
mmap(NULL,有效文件大小,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
mmap(存储映射)
最新推荐文章于 2025-02-26 18:17:36 发布