资讯专栏INFORMATION COLUMN

系统调用mmap详解[整理](待续)

import. / 2674人阅读

摘要:系统调用详解整理概述将磁盘文件映射到进程的虚拟地址空间通过对这段内存的读取和修改,来实现对文件的读取和修改而不需要再调用,等操作。相关函数疑惑点延伸参考资料引用引用引用

系统调用mmap详解整理 概述

将磁盘文件映射到进程的虚拟地址空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。

接口与形参解析
 void * /*返回开辟的虚拟地址空间的首地址*/
     mmap(void *addr, /*指定映射的起始地址, 建议设为NULL*/
          size_t len, /* 映射到内存的文件长度*/
          int prot, /* 映射区的保护方式 */
          /* 
           * PROT_EXEC: 映射区可被执行
           * PROT_READ: 映射区可被读取
           * PROT_WRITE: 映射区可被写入
          */
          int flags, 
          /*
           * MAP_SHARED: 写入映射区的数据会写回磁盘文化部, 
                         且允许其他映射该文件的进程共享。
           * MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制(copy-on-write), 
                         对此区域所做的修改不会写回原文件。
           */
          int fd, /* 由open返回的文件描述符, 代表要映射的文件 */ 
          off_t offset); /* 从文件中offset的位置开始映射 */
     
执行原理(步骤)

<其中,pgd记录了第一级页表的首地址>

在虚拟地址空间中为系统调用mmap创建vm_area_struct

通过文件描述符fd, 找到内核中该文件对应的文件结构体(struct file)

通过该文件的文件结构体, 调用file.file_operations.mmap函数, 实现了文件fd和内存虚拟地址的映射关系

//不同于系统调用mmap函数
int mmap(struct file* filp, struct vm_area_struct* vma);

需要指出的是,当前磁盘中文件内容并没有读入相应的内存地址空间中,需要通过缺页中断机制,将文件内容读入到内存中。

特性

缺陷

通过mmap无法追加文件内容

mmap减少了内核态到用户态的数据拷贝,但是当写操作过多时,从page cache写回磁盘的操作无法避免(其耗时远远大于内存的相互拷贝),这大大减少了mmap的作用。

相关函数 munmap
int munmap( void * addr, size_t len ) 
msync
int msync( void *addr, size_t len, int flags )

疑惑点:flags: MS_INVALIDATE
REF1
FEF2

mlock / munlock
int mlock(void* addr, size_t len);
int munlock(const void *addr, size_t len);
延伸 direct_io

man 2 open

Try to minimize cache effects of the I/O to and from this file. In general this will degrade performance, but it is useful in special situations, such as when applications do their own caching. File I/O is done directly to/from user-space buffers. The O_DIRECT flag on its own makes an effort to transfer data synchronously, but does not give the guarantees of the O_SYNC flag that data and necessary metadata are transferred. To guarantee synchronous I/O, O_SYNC must be used in addition to O_DIRECT. See NOTES below for further discussion.

参考资料

引用 0
引用 1
引用 2

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10640.html

相关文章

  • 【Linux内核】虚拟地址空间布局架构

    摘要:输出可见成功分配了新的内存那我们如何更加具体的看到是否获取了内存呢更改代码如下函数在内核的管理下将虚拟地址空间映射到内存,供函数使用。 虚拟地址空间布局架构(Lin...

    dreamans 评论0 收藏0
  • linux内存管理——mmap函数详解

    摘要:将映射区域锁定住,这表示该区域不会被置换。实际上,进程终止时,会自动解除映射。内存访问溢出采用的是页式管理机制,使用映射普通文件后,进程会在自己的地址空间新增一块空间,空间大小由的参数指定。 本文在这篇文章的基础上,略作修改。因为本人通过实验发现这篇文章存在些许错误。原文链接: https://yq.aliyun.com/article... mmap函数是unix/linux下的系统...

    mingzhong 评论0 收藏0
  • 嵌入式编程中应如何使用 mmap 访问 CPU 寄存器

    摘要:本文地址详解驱动虚拟地址和物理地址的映射嵌入式应用程序如何读取修改芯片寄存器的值和大家都知道,是用来做内存映射的,可以将一个文件描述符映射到内存当中,实现对该文件描述符的直接读写。 之前忘了在哪了,看到一个面试题:在 Linux 中如果不允许你写内核驱动,但是要访问内核寄存器,那应该怎么做?答案就是使用 mmap() 系统调用,搭配 Linux 的一个设备节点 /dev/mem。 本文...

    dcr309duan 评论0 收藏0
  • 前端知识点整理待续

    摘要:知识点闭包问题执行机制定时器线程理解构造函数内的方法与构造函数属性上方法的对比中都经历了什么深入理解中的属性和特性中的方法详解为什么编程语言的都要定义数据类型中与的区别轻松理解基本包装对象中数据类型内置对象包装类型对象关系基础之数组中的逻辑 JS知识点 JS hoist JS闭包问题 JS执行机制 JS定时器线程理解 构造函数内的方法与构造函数prototype属性上方法的对比 JS...

    silencezwm 评论0 收藏0
  • Nginx+PHP-FPM优化技巧总结

    摘要:同时配置中的为,默认为。表示监控所有核心,表示每秒采集,表示采集次。则考虑使用或等加速器来减少解释文件的耗时。程序性能监控常用的方法就是开启的性能监控功能,将输出结果通过软件分析。输出的文件名类似和,可以拿到平台下用进行图形化分析。 Nginx+PHP-FPM优化技巧总结 这里是从网上找到的一片文章,认真的实践了一遍,有很多值得参考的地方可以学习,由于之前的文章排版非常混乱,所以本人一...

    Zhuxy 评论0 收藏0

发表评论

0条评论

import.

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<