请注意,此文主要是针对BSD 系统的调用。

这是一个c标准库(libc, -lc)里的函数。

它的主要功能,概括的说,就是分配内存,或将文件或设备映射到内存中去。

在使用此函数前,你需要引入头文件,#include <sys/mman.h>,函数声明是这样的,

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

下面我们来详细的了解一下此函数,

对 mmap() 系统调用,将产生,从地址 addr 开始,并持续最多 len 个字节大小的页面,对,以 fd 描述的对象从字节偏移 offset 开始,的映射。注意,offset 或 len最好指定为页面大小(pagesize)的倍数,如果 offset 或 len 不是页面的倍数,则映射区域可能会超出指定范围。超出映射对象末尾的任何扩展都将被零填充。offset参数一般设为0,表示从文件头开始映射。

系统使用 addr 参数来确定映射的起始地址,其解释取决于 MAP_FIXED 标志的设置。怎么说呢,如果在 flags 中指定了 MAP_FIXED,系统将尝试将映射放置在指定地址,可能会删除该位置已存在的映射。如果未指定 MAP_FIXED,则系统将尝试使用从 addr 开始的地址范围,前提是它们不与任何现有映射重叠,包括由 malloc(3) 和其他此类分配器分配的内存。否则,系统将为映射(使用与实现相关的算法)选择不与任何现有映射重叠的备用地址。换句话说,如果没有指定 MAP_FIXED,如果指定的地址范围已经被其他对象映射,系统将尝试在地址空间中找到一个空位置。如果 addr 为零且未指定 MAP_FIXED,则系统将选择一个地址,以免与地址空间中的任何现有映射重叠。

在所有情况下,都会返回该区域的实际起始地址。如果指定了 MAP_FIXED,则成功的 mmap 会删除分配的地址范围内的任何先前映射。如果未指定 MAP_FIXED,则永远不会删除以前的映射。

映射区域的保护(即对应区域的可访问性)在 prot 参数中单一指定,或者通过或' | '运算符复合指定:

PROT_NONE 页面可能无法访问。
     PROT_READ 可以读取页面。
     PROT_WRITE 可以写入页面。
     PROT_EXEC 页面可以被执行。

请注意,由于硬件限制,在某些平台上,单独指定PROT_WRITE 可能兼具 PROT_READ参数,而 单独指定PROT_READ 可能兼具 PROT_EXEC参数。 可移植程序不应该依赖这些单独强制执行的标志。

flags 参数指定映射对象的类型、映射选项以及对页面的映射副本所做的修改是进程私有的(copy-on-write)还是要与其他引用共享。共享、映射类型和选项在 flags 参数中通过以下值指定:

MAP_ANONYMOUS     与 MAP_ANON 标志相同.
        MAP_ANON         映射与任何特定文件无关的匿名内存。 offset参数被忽略。 Mac OS X 规定: 用于创建 MAP_ANON 区域的文件描述符可用于传递一些 Mach VM 标志,如果没有与该区域关联的此类标志,则可以将其指定为 -1。 Mach VM 标志在 <mach/vm_statistics.h> 中定义,当前适用于 mmap 的标志是:

VM_FLAGS_PURGABLE    用于创建Mach可清除(即,volatile可见性)内存。

VM_MAKE_TAG(tag)         将 8 位标签与区域相关联。<mach/vm_statistics.h> 定义了一些预设tags(带有 VM_MEMORY_ 前缀)。 鼓励用户使用 240 到 255 之间的tags。这些tags被用于vmmap(1) 等工具来帮助识别特定的内存区域。

MAP_FILE                      从常规文件映射。(这是默认映射类型,无需指定。)

MAP_FIXED                    不允许系统选择与指定地址不同的地址。如果无法使用指定的地址,mmap() 将失败。如果指定了 MAP_FIXED,则 addr 必须是页面大小的倍数。如果 MAP_FIXED 请求成功,则 mmap() 建立的映射将替换从 addr 到 addr + len 范围内进程页面的任何先前映射。不鼓励使用此选项。

MAP_HASSEMAPHORE     通知内核该区域可能包含信号量并且可能需要特殊处理。

MAP_PRIVATE                     修改是私有的(copy-on-write)。

MAP_SHARED                     修改是共享的。

MAP_NOCACHE                   此映射中的页面不会保留在内核的内存缓存中。如果系统内存不足,MAP_NOCACHE 映射中的页面将首先被回收。此标志适用于具有很少局部性的映射,并向内核提示在不久的将来不太可能再次需要此映射中的页面。

注意,应用程序必须指定 MAP_PRIVATE 或 MAP_SHARED。

close(2) 系统调用不会取消映射页面,有关详细信息,请参阅 munmap(2)。

当前设计不允许进程指定交换空间的位置。将来我们可能会定义一个额外的映射类型,MAP_SWAP,其中文件描述符参数指定应该进行交换的文件或设备。

返回值

成功完成后,mmap() 返回一个指向映射区域的指针。 否则,返回 MAP_FAILED 值并设置 errno 以指示错误。

错误返回值

        在以下情况下 mmap() 系统调用将失败:

[EACCES]        标志 PROT_READ 被指定为 prot 参数的一部分,并且 fd 未以可读的方式打开。 标志 MAP_SHARED 和 PROT_WRITE 被指定为标志和 prot 参数的一部分,并且 fd 没有以可写方式打开。

[EBADF]        fd 参数不是一个有效的打开文件的描述符。

[EINVAL]        指定了 MAP_FIXED 并且 addr 参数不是页面对齐的,或者所需地址空间的一部分位于用户进程的有效地址空间之外。

标志不包括 MAP_PRIVATE 或 MAP_SHARED。

len 参数为负数或零。 从历史上看,如果参数为零,系统调用不会返回错误。 请参阅下面的“兼容性”部分中的其他潜在附加限制。

offset 参数未根据 getpagesize(3) 返回的页面大小进行页面对齐。

[ENODEV]        未指定 MAP_ANON 且 fd 引用的文件不支持映射。

[ENOMEM]      指定了 MAP_FIXED 并且 addr 参数不可用。指定了 MAP_FIXED 并且指定的地址范围超出了进程的地址空间限制。指定了 MAP_ANON,但可用内存不足。

[ENXIO]        指定范围内的地址对 fd 无效。

[EOVERFLOW]        指定范围内的地址超出为 fd 设置的最大偏移量。

了解一下mmap函数相关推荐

  1. 共享内存简介和mmap 函数

    一.共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 即每个进程地址空间都有一个共享存储器的映射区,当这块区 ...

  2. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

    文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

    文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...

  6. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

    共享存储映射 文件进程间通信 使用文件也可以完成 IPC,理论依据是,fork 后,父子进程共享文件描述符.也就共享打开的文件. 编程:父子进程共享打开的文件.借助文件进行进程间通信. 测试代码 /* ...

  7. 共享内存:mmap函数实现

    内存映射的应用: 以页面为单位,将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能; 将特殊文件进行匿名内存映射,可以为关联进程提供共享内存 ...

  8. mmap函数_分析由 mmap 导致的内存泄漏

    背景 一个程序链接 TCMalloc ,同时调用 mmap / munmap 管理一部分较大的内存 通过 TCMalloc 的统计信息,判断内存泄漏不是由 new / malloc 等常规接口导致的 ...

  9. mmap函数用法及示例程序

    UNIX网络编程第二卷进程间通信对mmap函数进行了说明.该函数主要用途有三个: 1.将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能: ...

  10. linux 内存映射-ioremap和mmap函数

    最近开始学习Linux驱动程序,将内存映射和ioremap,mmap函数相关资料进行了整理 一,内存映射  对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器 ...

最新文章

  1. 程序员请收好:10个非常有用的Visual Studio Code插件
  2. html5复合选择器,web前端练习31----Css,选择器(基本选择器,复合选择器,属性选择器,伪类,伪元素,优先级,雪碧图练习)...
  3. 中国首档程序员真人秀,20位选手找bug做模型,结果一开场主办方就惨遭攻击...
  4. ×××安全协议之IPsec
  5. 基类的析构函数不能被继承。_为什么要把C++类中的析构函数声明为虚函数?
  6. 2021年网购大数据:哪些品类坑最多?什么价位的商品最有保障?
  7. minimum-depth-of-binary-tree (搜索)
  8. NEUQ 2015: Bitmap(二维hash)
  9. Vue中的 computed 和 watch的区别
  10. 嵌入式linux系统移植的四大步骤_如何移植开源软件到嵌入式Linux系统
  11. 51nod-猴猴吃香蕉【dp】
  12. 【dfs】家族(jzoj 1985)
  13. (六)ElasticSearch 6.1.1聚合查询
  14. 电子科技大学计算机博士不好毕业吗,超六成博士生无法正常毕业:教育部数据告诉你哪个专业和学校最难读...
  15. http响应状态码大全
  16. 我被房东的由器了 怎么办呀 高手们请帮帮
  17. 第十八篇_Class文件
  18. confluence 无法保存页面 排错记录
  19. 赞美是朵花,赠人玫瑰,手有余香
  20. Android图片轮播控件

热门文章

  1. 使用Keras进行单模型多标签分类
  2. STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始
  3. EEC: LEARNING TO ENCODE AND REGENERATE IMAGES FOR CONTINUAL LEARNING
  4. 2021数学建模国赛(后续)
  5. ASP.NET MVC5 网站开发实践 - 概述
  6. 再见了新阳丽舍,再见了新雅阁301
  7. 安科瑞预付费系统的实际设计与应用
  8. 互联网行业发展形势乱弹--娱乐和社交
  9. 对数组排序(选择法)
  10. 《数字图像处理》第二章-数字图像基础 笔记