美文网首页
mmap的那些事

mmap的那些事

作者: 北雁南飞_8854 | 来源:发表于2021-05-25 23:04 被阅读0次

在常规的文件读取中,内核必须将页面缓存复制到用户缓冲区中。
使用mmap时,内核将应用的虚拟地址空间直接映射到页面缓存中。
头文件 <sys/mman.h>
函数原型
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void* start,size_t length);

参数说明

start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。

length:映射区的长度。//长度单位是 以字节为单位,不足一内存页按一内存页处理

prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起

PROT_EXEC //页内容可以被执行

PROT_READ //页内容可以被读取

PROT_WRITE //页可以被写入

PROT_NONE //页不可访问

flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体

MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。

MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。

MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。

MAP_DENYWRITE //这个标志被忽略。

MAP_EXECUTABLE //同上

MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。

MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。

MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。

MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。

MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。

MAP_FILE //兼容标志,被忽略。

MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。

MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。

MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。

fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射。

offset:被映射对象内容的起点。

返回说明

成功执行时,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:试着访问不属于进程的内存区

map()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
不同进程间的用户空间是完全隔离的,内核空间是共享的。

数据传输的两种形式

Binder内存拷贝的实现
为了减少一次拷贝,接收数据的进程必须同时满足下面三个条件:

  1. 在用户空间分配一块连续区域A(仅仅是虚拟地址的分配)。
  2. 在内核空间分配一块同样大小的连续区域B(同样仅仅是虚拟地址的分配)。
  3. 在每次数据通信的时候,根据实际需求分配物理页,并将该物理页同时映射到A/B中偏移相同的位置。

相关文章

  • mmap的那些事

    在常规的文件读取中,内核必须将页面缓存复制到用户缓冲区中。使用mmap时,内核将应用的虚拟地址空间直接映射到页面缓...

  • mmap

    简单的目录 mmap基础概念 mmap内存映射原理 mmap和常规文件操作的区别 mmap优点总结 mmap相关函...

  • 内存映射

    转自认真分析mmap:是什么 为什么 怎么用 阅读目录mmap基础概念mmap内存映射原理mmap和常规文件操作的...

  • 【转】linux库函数mmap()原理

    linux库函数mmap()原理 目录 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作...

  • Linux 共享内存函数

    mmap 函数实现共享内存 1. 匿名mmap 匿名存储映射:调用mmap函数时,指定 MAP_ANONYMOUS...

  • NIO中FileChannel和MappedByteBuffer

    MappedByteBuffer实现MMAP(Memory Mapped Files)技术(内存映射) mmap(...

  • 2020-03-17 想了解文件内存映射mmap的过来看看啊

    测试fread,fwrite,mmap_read,mmap_write分别在多线程单线程下的效率。 结论是mmap...

  • linux手册翻译——mmap(2)

    mmap,munmap-将文件或设备映射(消取映射)到内存 mmap() mmap()将在调用者进程的虚拟地址空间...

  • mmap和MMKV

    一. mmap 1. 什么是mmap mmap是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址...

  • 内存映射

    mmap 背景 mmap将一个文件或者其它对象映射进内存,文件以mmap的方式映射到用户的虚拟内存空间,省去了从内...

网友评论

      本文标题:mmap的那些事

      本文链接:https://www.haomeiwen.com/subject/gtlhsltx.html