11.4.2 内存映射的相关接口
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 内存映射的相关接口相关推荐
- stm32qspi内存映射_STM32F7-discovery QSPI接口使用心得
STM32电机培训online,大佬带你玩电机 FMC和QSPI引脚冲突的解决 分享一个 QSPI N25Q256A的读写程序,支持QUAD, 4字节模式 1.QuadSPI接口的特点.与普通的SPI ...
- 内存映射获取行数_使用内存映射文件获取巨大的矩阵
内存映射获取行数 总览 矩阵可能真的很大,有时甚至比您可以容纳在一个数组中的要大. 您可以通过具有多个数组来扩展最大大小,但这会使堆大小确实很大且效率低下. 一种替代方法是在内存映射文件上使用包装器. ...
- 使用内存映射文件获取巨大的矩阵
总览 矩阵可能真的很大,有时甚至比一个数组中可以容纳的更大. 您可以通过具有多个数组来扩展最大大小,但这会使堆大小确实很大且效率低下. 一种替代方法是在内存映射文件上使用包装器. 内存映射文件的优点是 ...
- 【java】java中内存映射文件和IO
转载:https://leokongwq.github.io/2017/02/25/java-memorymapped-file-and-io.html 对大多数Java开发人员来说,Java中的内存 ...
- 网络传输大数据——内存映射
内存映射技术相关知识 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页 ...
- 接口规范 11. 串流相关接口
11 串流相关接口 11.1.查询串流任务 用途 查询服务器上的串流任务. 请求 streamingMgr/?request=get_streaming&id= id 串流任务在服务器上的唯一 ...
- 【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 结构体完整源码 ...
- 多线程、机械硬盘、固态硬盘、内存映射相关资料
SSD和机械硬盘区别 机械硬盘是机械结构,包含磁盘和磁头等,读写数据时,包含磁头寻道和盘面转动时间 SSD是一种不同的结构,内部是浮栅晶体管,可以没有寻道这些操作,因此数据比机械硬盘快 编程方面和磁盘 ...
- TC297 Memory Maps 内存映射
TC297的框图 3.Memory Maps 内存映射 TC29x CPU相关内存如下: PMU0(程序存储器单元)特点如下: -8M 程序闪存 -Data Flash Memory -User Co ...
- Linux内存管理内存映射以及通过反汇编定位内存错误问题
提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道--变量,其实是内存地址的一个抽像名字罢了.在静态编译的程序中,所有的变量名都会在编译时被转成内存地址.机器 ...
最新文章
- 软件如何优雅地向前兼容?
- mysql自定义数据类型_MySQL中的数据类型
- 鸿蒙眼镜怎么样,Babiators儿童太阳镜怎么样 Babiators儿童太阳镜测评
- Spring中bean属性注入方式总结:构造方法、setter注入、p命令空间注入、SpEL注入、集合注入
- oracle学习-数据迁移
- 什么叫共轭先验或者共轭分布?
- mysql8.0怎么设置中文版_MySQL 8.0 版本修改字符编码
- 如何从道客巴巴上下载收费文档之我见
- MATLAB图像处理(包括图像类型转换)----转载
- Mac上如何测试IE浏览器兼容性-虚拟机解决方案
- win7系统服务器角色向导,Windows Server2012入门-添加服务器角色和功能
- 图像处理_彩色图像处理_推导产生一幅彩色图像的补色的CMY变换
- 贪心算法基础之活动时间安排(一)安排 51nod 贪心教程
- mysql和ocrcle_oracle 12.1 RAC的ocr磁盘组异常恢复
- 什么是top sql
- [软件工具][原创]pcl引用库一键配置到VisualStudio中支持vs2015-v2022使用教程
- 云服务器搭建全过程(阿里云、腾讯云等...通用)
- 惠普计算机使用方法,惠普笔记本电脑功能键(HP/联想等笔记本键盘fn键使用说明大全)...
- Android推特图片保存路径,如何将twitter的URL内容(tweet,user,comment,…)添加到我的android应用程序...
- 微星GE62 NVIDIA960m 双系统ubuntu16.04 配置caffe-ssd