mmap相关函数

mmap相关函数

mmap

UNIX 提供了一个有用的功能以运行程序共享内存。mmap(内存映射)函数的作用是建立一段可以被两个或更多个程序读写的内存。一个程序对它所做出的修改可以被其他程序看见。

mmap()必须以PAGE_SIZE(页) 为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。

mmap 函数创建一个指向一段内存区域的指针,该内存区域与可以通过一个打开的文件描述符访问的文件的内容相关联。

#include <sys/mman.h>
void* mmap(void* addr, size_t len, int prot, int flags, int fd, off_t off);

函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。
失败时,mmap()返回MAP_FAILED[其值为(void *)-1],munmap返回-1。
errno被设为以下的某个值:

 EACCES:访问出错
 EAGAIN:文件已被锁定,或者太多的内存已被锁定
 EBADF:fd不是有效的文件描述词
 EINVAL:一个或者多个参数无效
 ENFILE:已达到系统对打开文件的限制
 ENODEV:指定文件所在的文件系统不支持内存映射
 ENOMEM:内存不足,或者进程已超出最大内存映射数量
 EPERM:权能不足,操作不允许
 ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志
 SIGSEGV:试着向只读区写入
 SIGBUS:试着访问不属于进程的内存区

addr : 被映射到进程空间的起始地址,可以为一个空指针,此时选择起始地址的任务留给内核来完成,也可以自己安排进程地址空间。
len : 数据段长度
port : 内存段的访问权限

   PROT_EXEC //页内容可以被执行
   PROT_READ //页内容可以被读取
   PROT_WRITE //页可以被写入
   PROT_NONE //页不可访问

flags : 指定映射对象的类型,映射选项和映射页是否可以共享

   MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。
   //并且起始地址必须落在页的边界上。
   MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
   MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
   MAP_DENYWRITE //这个标志被忽略。
   MAP_EXECUTABLE //同上
   MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
   MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
   MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
   MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
   MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。
   MAP_FILE //兼容标志,被忽略。
   MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
   MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
   MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。

fd : 有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射。
off : 改变经共享内存段访问的文件中数据的起始偏移地址。

msync

把在该内存段的某个部分或者整段中的修改写回到被映射的文件中(或者从被映射文件里读出)。需要文件更新时必须调用

#include <sys/mman.h>
int msync(void* addr, size_t len, int flags);

内存段需要修改的部分作为参数传递过来的起始地址addr和长度len确定。
flags 参数控制着执行修改的具体方式:
    MS_ASYNC 采用异步写方式
    MS_SYNC采用同步写方式
    MS_INVALIDATE 从文件中读回数据

munmap

释放内存段。

int munmap(void* addr, size_t len);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值