加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux 内存映射函数 mmap()函数详解

发布时间:2016-09-04 22:40:45 所属栏目:Linux 来源:站长网
导读:一、概述 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这

返回说明

成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED[其值为(void *)-1],munmap返回-1。errno被设为以下的某个值

EACCES:访问出错

EAGAIN:文件已被锁定,或者太多的内存已被锁定

EBADF:fd不是有效的文件描述词

EINVAL:一个或者多个参数无效

ENFILE:已达到系统对打开文件的限制

ENODEV:指定文件所在的文件系统不支持内存映射

ENOMEM:内存不足,或者进程已超出最大内存映射数量

EPERM:权能不足,操作不允许

ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志

SIGSEGV:试着向只读区写入

SIGBUS:试着访问不属于进程的内存区

int munmap(void *start, size_t length)

start:要取消映射的内存区域的起始地址

length:要取消映射的内存区域的大小。

返回说明

成功执行时munmap()返回0。失败时munmap返回-1.

int msync(const void *start, size_t length, int flags);

对映射内存的内容的更改并不会立即更新到文件中,而是有一段时间的延迟,你可以调用msync()来显式同步一下, 这样你内存的更新就能立即保存到文件里

start:要进行同步的映射的内存区域的起始地址。

length:要同步的内存区域的大小

flag:flags可以为以下三个值之一:

MS_ASYNC : 请Kernel快将资料写入。

MS_SYNC : 在msync结束返回前,将资料写入。

MS_INVALIDATE : 让核心自行决定是否写入,仅在特殊状况下使用

三、用户空间和驱动程序的内存映射

3.1、基本过程

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读