11.4.2 内存映射的相关接口

mmap函数的接口定义如下:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

这个函数的参数比较多。

其中fd、offset和length三个参数指定了内存映射的源,即将fd对应的文件,从offset位置起,将长度为length的内容映射到进程的地址空间。

对于文件映射,调用mmap之前需要调用open取到对应文件的文件描述符

参数使用:

第一个参数addr用于指定将文件对应的内容映射到进程地址空间的起始地址。一般来讲为了可移植性,该参数总是指定为NULL,表示交给内核去选择合适的位置。

第三个参数prot用于设置对内存映射区域的保护,它的合法值及其含义如表11-8所示。

表11-8 mmap调用中prot的合法值及其含义

flags参数用于指定内存映射是共享映射还是私有映射,也用于指定内存映射是文件映射还是匿名映射。flags可选的标志位及含义如表11-9所示。

表11-9 mmap调用中flags可选的标志位及含义

其中调用mmap函数时,MAP_SHARED和MAP_PRIVATE标志位,两者必须指定一个

flags中另一个可选的标志位是MAP_FIXED。如果指定了该标志位,那么表示函数调用者铁了心地要把内容映射到对应的地址上。这种情况下,addr一般要求按页对齐。如果内核无法映射文件到该指定位置,则调用失败。如果地址和长度指定的内存区域和已有映射有重叠部分,那么重叠区的原始内容将被丢弃,然后填入新的内容。使用该选项需要非常了解进程的地址空间,否则不建议使用。

需要注意的是mmap系统调用的操作单元是页

参数addr和offset都必须按页对齐,即必须是页面大小的整数倍。

在Linux下,页面大小是4096字节,该值可以通过getconf命令来获取到:

getconf PAGESIZE

4096

对于编程接口,Linux提供了sysconf函数来获取到相关配置项的值:

long sysconf(int name);

对于获取页面大小而言,可以通过如下代码获取到页面的大小:long pagesize = sysconf(_SC_PAGESIZE);

在进程的地址空间里,映射区域总是页面的整数倍。但是有些时候,mmap传递的length值并非页面的整数倍,比如文件映射时,文件的大小或要映射进内存的区域并非页面的整数倍,这时候,mmap会按照页面的大小向上取整,多出来的内存区域(最后一个有效字节到映射区域边界)会填充0。

当mmap调用成功时,则返回映射区域的起始地址,如果失败,则返回MAP_FAILED,并置errno。

如果不再需要对应的内存映射了,可以调用munmap函数,解除该内存映射:

int munmap(void *addr, size_t length);

其中addr是mmap返回的内存映射的起始地址,length是内存映射区域的大小。

执行过munmap后,如果继续访问内存映射范围内的地址,那么进程会收到SIGSEGV信号,引发段错误。

需要注意的是,关闭对应文件的文件描述符并不会引发munmap。

如果创建内存映射时flags中带上了MAP_PRIVATE标志位,那么解除该内存映射时,调用进程对内存映射的所有改动都会被丢弃。

介绍完基本接口,下面将分别介绍4种不同的映射,以及它们的应用场景。

11.4.2 内存映射的相关接口相关推荐

  1. stm32qspi内存映射_STM32F7-discovery QSPI接口使用心得

    STM32电机培训online,大佬带你玩电机 FMC和QSPI引脚冲突的解决 分享一个 QSPI N25Q256A的读写程序,支持QUAD, 4字节模式 1.QuadSPI接口的特点.与普通的SPI ...

  2. 内存映射获取行数_使用内存映射文件获取巨大的矩阵

    内存映射获取行数 总览 矩阵可能真的很大,有时甚至比您可以容纳在一个数组中的要大. 您可以通过具有多个数组来扩展最大大小,但这会使堆大小确实很大且效率低下. 一种替代方法是在内存映射文件上使用包装器. ...

  3. 使用内存映射文件获取巨大的矩阵

    总览 矩阵可能真的很大,有时甚至比一个数组中可以容纳的更大. 您可以通过具有多个数组来扩展最大大小,但这会使堆大小确实很大且效率低下. 一种替代方法是在内存映射文件上使用包装器. 内存映射文件的优点是 ...

  4. 【java】java中内存映射文件和IO

    转载:https://leokongwq.github.io/2017/02/25/java-memorymapped-file-and-io.html 对大多数Java开发人员来说,Java中的内存 ...

  5. 网络传输大数据——内存映射

    内存映射技术相关知识 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页 ...

  6. 接口规范 11. 串流相关接口

    11 串流相关接口 11.1.查询串流任务 用途 查询服务器上的串流任务. 请求 streamingMgr/?request=get_streaming&id= id 串流任务在服务器上的唯一 ...

  7. 【Linux 内核 内存管理】内存映射相关数据结构 ③ ( vm_area_struct 结构体成员分析 | shared 成员 | anon_vma_chain 成员 | anon_vma 成员 )

    文章目录 一.vm_area_struct 结构体成员分析 1.shared 成员 2.anon_vma_chain 成员 3.anon_vma 成员 二.vm_area_struct 结构体完整源码 ...

  8. 多线程、机械硬盘、固态硬盘、内存映射相关资料

    SSD和机械硬盘区别 机械硬盘是机械结构,包含磁盘和磁头等,读写数据时,包含磁头寻道和盘面转动时间 SSD是一种不同的结构,内部是浮栅晶体管,可以没有寻道这些操作,因此数据比机械硬盘快 编程方面和磁盘 ...

  9. TC297 Memory Maps 内存映射

    TC297的框图 3.Memory Maps 内存映射 TC29x CPU相关内存如下: PMU0(程序存储器单元)特点如下: -8M 程序闪存 -Data Flash Memory -User Co ...

  10. Linux内存管理内存映射以及通过反汇编定位内存错误问题

    提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道--变量,其实是内存地址的一个抽像名字罢了.在静态编译的程序中,所有的变量名都会在编译时被转成内存地址.机器 ...

最新文章

  1. 软件如何优雅地向前兼容?
  2. mysql自定义数据类型_MySQL中的数据类型
  3. 鸿蒙眼镜怎么样,Babiators儿童太阳镜怎么样 Babiators儿童太阳镜测评
  4. Spring中bean属性注入方式总结:构造方法、setter注入、p命令空间注入、SpEL注入、集合注入
  5. oracle学习-数据迁移
  6. 什么叫共轭先验或者共轭分布?
  7. mysql8.0怎么设置中文版_MySQL 8.0 版本修改字符编码
  8. 如何从道客巴巴上下载收费文档之我见
  9. MATLAB图像处理(包括图像类型转换)----转载
  10. Mac上如何测试IE浏览器兼容性-虚拟机解决方案
  11. win7系统服务器角色向导,Windows Server2012入门-添加服务器角色和功能
  12. 图像处理_彩色图像处理_推导产生一幅彩色图像的补色的CMY变换
  13. 贪心算法基础之活动时间安排(一)安排 51nod 贪心教程
  14. mysql和ocrcle_oracle 12.1 RAC的ocr磁盘组异常恢复
  15. 什么是top sql
  16. [软件工具][原创]pcl引用库一键配置到VisualStudio中支持vs2015-v2022使用教程
  17. 云服务器搭建全过程(阿里云、腾讯云等...通用)
  18. 惠普计算机使用方法,惠普笔记本电脑功能键(HP/联想等笔记本键盘fn键使用说明大全)...
  19. Android推特图片保存路径,如何将twitter的URL内容(tweet,user,comment,…)添加到我的android应用程序...
  20. 微星GE62 NVIDIA960m 双系统ubuntu16.04 配置caffe-ssd

热门文章

  1. 中国互联网二十四年红黑史
  2. js中获取当前url路径
  3. python123外汇兑换计算器_使用python+PyQt5 实现等额本金计算器
  4. Unity PlayerPrefs 游戏存档
  5. 录制高清微课视频,录屏软件有什么推荐?
  6. 测试用例-1-微信发红包功能
  7. No.3PPT风格及搭配
  8. EST 云硬盘修复小工具-SAS希捷固件升级工具
  9. python deap_遗传算法库DEAP的示例代码的学习和分析
  10. 有什么软件可以快速测试到苹果,苹果官方App测试工具TestFlight