mmap函数及其映射失败原因分析

原创 2012年10月16日 09:27:03

mmap函数

头文件:#include <sys/mman.h>

函数原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

参数  start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。
  length:映射区的长度。
  prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
  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:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。

  offset:被映射对象内容的起点。

第三个参数一般只用PROT_READ|PROT_WRITE,第四个参数一般用MAP_SHARED。

mmap设备操作  mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。

 

mmap失败原因分析:若第二个参数length或者其大小不是页面大小的整数倍时会导致映射失败。

mmap 错误

int readlen = 5*1024*1024; //int readlen = 1024; int fd = open("/home/bonc/BC000D0300420131210000001...
  • tina_j
  • tina_j
  • 2013-12-16 15:59:08
  • 1230

mmap失败追踪

今天在小试mmap函数的时候,本以为会一路畅通没想到执行的时候出现了段错误,调试了一下发现在mmap返回以后访问返回的指针出了问题,代码如下 #define REC_NUM 100 typedef s...
  • tohsduo
  • tohsduo
  • 2016-08-19 14:52:26
  • 332

mmap ENOMEM(errno 12) 错误

今天触发了一个大坑,发现mmap在映射大量文件的时候,会失败,返回ENOMEM错误。 找了一圈,有的说是swap不够,增加了swap也没用,可见不是这个问题。 后来看了美军一个文章...
  • pennyliang
  • pennyliang
  • 2014-12-02 14:58:40
  • 7045

linux mmap 总线错误

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1988350&ordertype=1 用mmap映射两个文件,然后把一个文件的内容复制到另...
  • wangjingyu00711
  • wangjingyu00711
  • 2014-12-06 13:09:56
  • 609

关于mmap()的返回值

man 一下看看: On success, mmap() returns a pointer to the mapped area.  On error, the value MAP_FAILED ...
  • u013176681
  • u013176681
  • 2014-09-16 08:29:13
  • 1888

linux mmap简介及bus error的解决方案

无亲缘关系的两进程之间,使用mmap共享内存进行通信,出现bus error。 MMap 通信机制简介 关于mmap      mmap将一个文件或者其它对象映射进内存。文件被映射到多个...
  • zhangxiao93
  • zhangxiao93
  • 2014-12-24 17:05:17
  • 3961

摄像头应用采集程序出错mmap映射出错

出错描述如下: 在2.6.28内核下对cam130进行操作,程序一点问题没有,可以正常采集摄像头数据,换到2.6.38这个版本的时候,驱动发生了变化,友善对于这个版本的cam130摄像头驱动不开源,...
  • Leichelle
  • Leichelle
  • 2012-04-04 23:10:49
  • 1054

Android深入浅出之Binder机制

Android深入浅出之Binder机制 一 说明  Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。所以搞...
  • omnispace
  • omnispace
  • 2016-09-21 16:13:12
  • 720

System V共享内存函数基础

函数说明shmgetint shmget(key_t key, size_t size, int shmflg);通过参数key返回一个System V共享内存段关联标记。当key设置为IPC_PRI...
  • erlang_hell
  • erlang_hell
  • 2016-04-21 20:11:21
  • 385

msync(void *addr,size_t len, int flags) 函数的使用问题

msync(void *addr,size_t len, int flags) 函数使用问题【注意】:           只有在调用了munmap()后或者msync()时,才把内存中的相应内容写回...
  • TODD911
  • TODD911
  • 2011-06-28 13:48:00
  • 2922
收藏助手
不良信息举报
您举报文章:mmap函数及其映射失败原因分析
举报原因:
原因补充:

(最多只允许输入30个字)