0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

mmap原理详解

科技绿洲 来源:Linux开发架构之路 作者:Linux开发架构之路 2023-11-09 14:59 次阅读
  1. 一句话概括mmap

mmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。

这样,进程不仅能像访问内存一样读写文件,多个进程映射同一文件,还能保证虚拟空间映射到同一块物理内存,达到内存共享的作用。

  1. 虚拟内存?虚拟空间?

其实是一个概念,前一篇对于这个词没有确切的定义,现在定义一下:

虚拟空间就是进程看到的所有地址组成的空间,虚拟空间是某个进程对分配给它的所有物理地址(已经分配的和将会分配的)的重新映射。

而虚拟内存,为啥叫虚拟内存,是因为它就不是真正的内存,是假的,因为它是由地址组成的空间,所以在这里,使用虚拟空间这个词更加确切和易懂。(不过虚拟内存这个词也不算错)

2.1 虚拟空间原理

2.1.1物理内存

首先,物理地址实际上也不是连续的,通常是包含作为主存的DRAM和IO寄存器

图片

以前的CPU(如X86)是为IO划分单独的地址空间,所以不能用直接访问内存的方式(如指针)IO,只能用专门的方法(in/read/out/write)诸如此类。

现在的CPU利用PCI总线将IO寄存器映射到物理内存,所以出现了基于内存访问的IO。

还有一点补充的,就如同进程空间有一块内核空间一样,物理内存也会有极小一部分是不能访问的,为内核所用。

2.1.2三个总线

这里再补充下三个总线的知识,即:地址总线、数据总线、控制总线

  • 地址总线,用来传输地址
  • 数据总线,用来传输数据
  • 控制总线,用来传输命令

比如CPU通过控制总线发送读取命令,同时用地址总线发送要读取的数据虚地址,经过MMU后到内存

内存通过数据总线将数据传输给CPU。

虚拟地址的空间和指令集的地址长度有关,不一定和物理地址长度一致,比如现在的64位处理器,从VA角度看来,可以访问64位的地址,但地址总线长度只有48位,所以你可以访问一个位于2^52这个位置的地址。

2.1.3虚拟内存地址转换(虚地址转实地址)

上面已经明确了虚拟内存是虚拟空间,即地址的集合这一概念。基于此,来说说原理。

如果还记得操作系统课程里面提到的虚地址,那么这个虚地址就是虚拟空间的地址了,虚地址通过转换得到实地址,转换方式课程内也讲得很清楚,虚地址头部包含了页号(段地址和段大小,看存储模式:页存储、段存储,段页式),剩下部分是偏移量,经过MMU转换成实地址。

图片

存储方式

图片

如图则是页式存储动态地址变换的方式

虚拟地址头部为页号通过查询页表得到物理页号,假设一页时1K,那么页号*偏移量就得到物理地址

图片

如图所示,段式存储

虚拟地址头部为段号,段表中找到段基地址加上偏移量得到实地址

图片

段页式结合两者,如图所示。

  1. mmap映射

至此,如果对虚拟空间已经了解了,那么接下来,作为coder,应该自动把虚拟空间无视掉,因为Linux的目的也是要让更多额进程能享用内存,又不让进程做麻烦的事情,是将虚拟空间和MMU都透明化,让进程(和coder)只需要管对内存怎样使用。

所以现在开始不再强调虚拟空间了。

mmap就是将文件映射到内存上,进程直接对内存进行读写,然后就会反映到磁盘上。

图片

  • 虚拟空间获取到一段连续的地址
  • 在没有读写的时候,这个地址指向不存在的地方(所以,上图中起始地址和终止地址是还没分配给 进程的)
  • 好了,根据偏移量,进程要读文件数据了,数据占在两个页当中(物理内存着色部分)
  • 这时,进程开始使用内存了,所以OS给这两个页分配了内存(即缺页异常)(其余部分还是没有分配)
  • 然后刚分配的页内是空的,所以再将相同偏移量的文件数据拷贝到物理内存对应页上。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117723
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72765
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
收藏 人收藏

    评论

    相关推荐

    拆解mmap内存映射的本质!

    mmap 内存映射里所谓的内存其实指的是虚拟内存,在调用 mmap 进行匿名映射的时候(比如进行堆内存的分配),是将进程虚拟内存空间中的某一段虚拟内存区域与物理内存中的匿名内存页进行映射,当调用
    的头像 发表于 01-24 14:30 348次阅读
    拆解<b class='flag-5'>mmap</b>内存映射的本质!

    Linux的mmap文件内存映射机制

    Linux的mmap文件内存映射机制在讲述文件映射的概念时, 不可避免的要牵涉到虚存(SVR 4的VM). 实际上, 文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施, 好似用户将文件
    发表于 03-08 09:54

    字符设备驱动另一种写法—mmap方法操作LED

    。经过自己的研究之后,我发现还有另外一种写法,直接在应用层操作,省去了内核中的地址映射部分,使得用户可以在应用层直接操作LED。 mmap方法是把设备物理地址直接映射到用户空间的一种系统调用方法,他使得
    发表于 01-02 17:38

    dma_alloc_coherent申请内存的访问速度,请问有什么办法能加快访问mmap的DMA内存?

    使用dma_alloc_coherent申请了一块内存,然后使用mmap映射到用户空间。然后,我用千兆网卡(CPSW驱动)进行发送(UDP方式),测量到的速度仅有12.5MB/s。 我又另外做了一个测试
    发表于 06-04 07:47

    mmap()函数映射到内存中出现bus error的错误

    在2440开发板上将一副BMP图片显示到LCD上(不用GUI),我的做法是将BMP图片用mmap()函数映射到内存中,在将其读到Framebuffer设备中显示(frambuffer有驱动),映射
    发表于 02-25 12:42

    在arm里怎样实现mmap编写驱动和应用共享内存呢

    ② 确定属性:是否使用 cache、buffer③ 建立映射关系在file_operation里面建立mmap进行mmap的函数编写这样在驱动程序的内存空间就被建立了映射,用应用程序访问读取,都行应用程序
    发表于 05-17 09:59

    rt-smart qemu-vexpress-a9平台mmap错误是什么原因?

    mmap系统调用传进去的pgoffset有问题是什么原因?
    发表于 11-01 11:06

    linux_mmap_access_performance

    linux 内存访问提升性能的一片论文,需要理解kernel的mmap方式,比较适合优化驱动
    发表于 02-23 15:48 14次下载

    mmap系统调用和vmalloc获取地址空间

    mmap()系统调用是在用户进程与内核之间共享内存区域的常用方法。我们最近有个程序,需要应用进程能够读取内核驱动获取的数据,经过简单的调研,决定采用mmap方式。
    的头像 发表于 02-02 16:13 3950次阅读

    mmap作为Linux内存管理的关键之一

    mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。
    发表于 04-28 17:16 498次阅读
    <b class='flag-5'>mmap</b>作为Linux内存管理的关键之一

    linux drivers中的mmap实现

    将设备驱动内核空间的内存映射到用户空间里,可以通过用户空间中的mmap系统调用代替系统调用write和read。目的是提高读写效率。
    发表于 05-15 10:31 1436次阅读

    Linux的mmap文件内存映射机制

    讲述mmap和munmap系统调用了. mmap调用实际上就是一个内存对象vma的创建过程, mmap的调用格式是:  void * mmap(void *start, size_t
    发表于 04-02 14:35 332次阅读

    一文详细了解mmap内存映射

    mmap是一种内存映射的方法,这一功能可以用在文件的处理上,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。在编程时可以使某个磁盘文件
    的头像 发表于 05-05 15:32 2036次阅读

    Arduino语法详解含示例详解

    Arduino语法详解_含示例详解
    发表于 07-19 14:09 6次下载

    内核mmap_sem锁的危害和相关优化

    mmap_sem锁是进程为了保护自身虚拟地址空间不受多线程并发访问影响而设计的。
    的头像 发表于 02-07 16:01 452次阅读