映射的保护和同步

保护权限

mmap函数的prot参数可指定内存映射区的保护权限,例如指定PROT_READ和PROT_EXEC,在调用open打开文件就应该指定O_RDONLY或者O_RDWR。如果指定了PROT_WRITE,打开的文件应该使用O_WRONLY或者O_RDWR。

 

由于一些硬件架构对于内存的保护粒度有所不同,情况会变的有些复杂:

1. 一般打开文件指定O_RDWR标记就已经满足基本的使用了。

2. 如果prot参数只指定了PROT_WRITE,且open以O_WRONLY标记打开文件,内存映射的保护权限和打开文件的权限理论上是兼容的,但是调用mmap却会失败,设置errno为EACCES错误。因为一些硬件架构上PROT_WRITE隐含了PROT_READ,这意味着系统分页可写也可读,但这与O_WRONLY标记实际上是不兼容的(这与硬件架构有关系)。

3. 以O_RDONLY标记打开一个文件,mmap调用指定了MAP_PRIVATE创建私有内存映射,因为MAP_PRIVATE映射上的修改操作不会反映到打开的文件中,所以prot参数可以指定任意的组合权限。

对于一个MAP_SHARED映射来说,在MAP_SHARED映射上的修改操作会反映到打开的文件中,唯一与O_RDONLY标记兼容的内存保护权限就是PROT_READ | PROT_EXEC。

 

2. 映射区域同步——msync

通常为确保映射区的数据写入物理磁盘上的文件中,在调用munmap解除映射前需要调用msync函数。前面我们没有调用msync函数依然能在文件中看到写入的数据,这是因为内核会自动将MAP_SHARED映射区的内容同步到打开的文件中,但内核并不保证何时同步数据。

通过调用msync函数可以让应用程序显式的控制文件与内存映射中的数据同步。

返回值:成功返回0,失败返回-1并设置errno

addr:需要同步的内存映射区起始地址

length:需要同步的数据大小

flags

内存映射主要分两种:文件映射和匿名映射。文件映射已经讲了,在映射过程中需要依赖一个文件,而匿名映射顾名思义就是创建匿名的映射区,不需要依赖文件。

可通过mmap函数的参数flags来指定MAP_ANONYMOUS (或MAP_ANON)创建一个匿名映射,由于不需要依赖文件,参数fd设置为-1,例如:

char *addr = mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 
一般在linux上当指定了MAP_ANONYMOUS之后,会自动忽略参数fd的值,但是在类unix上可能必须指定MAP_ANONYMOUS并设置fd为-1,因此为了确保程序的可移植性,推荐这样做。
 

:设置同步数据的方式(MS_SYNC,MS_ASYNC,MS_INVALIDATE)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值