| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 了解一下mmap函数 -> 正文阅读 |
|
[C++知识库]了解一下mmap函数 |
请注意,此文主要是针对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_WRITE 可能兼具?PROT_READ参数,而 单独指定PROT_READ 可能兼具?PROT_EXEC参数。 可移植程序不应该依赖这些单独强制执行的标志。 flags 参数指定映射对象的类型、映射选项以及对页面的映射副本所做的修改是进程私有的(copy-on-write)还是要与其他引用共享。共享、映射类型和选项在 flags 参数中通过以下值指定: ????????MAP_ANONYMOUS? ? ?与 MAP_ANON 标志相同. ????????????????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 设置的最大偏移量。?? ???????? ?? ? ? ? ? ? ? ? ? ? ? ? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:26:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |