用户态内存映射

这篇具有很好参考价值的文章主要介绍了用户态内存映射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。

用户态内存映射,Linux,linux

对于堆的申请来讲,mmap 是映射内存空间到物理内存。

如果一个进程想映射一个文件到自己的虚拟内存空间,也要通过 mmap 系统调用。这个时候 mmap 是映射内存空间到物理内存再到文件。

如果是匿名映射,则调用 mm_struct 里面的 get_unmapped_area 函数。这个函数其实是 arch_get_unmapped_area。它会调用 find_vma_prev,在表示虚拟内存区域的 vm_area_struct 红黑树上找到相应的位置。之所以叫 prev,是说这个时候虚拟内存区域还没有建立,找到前一个 vm_area_struct。

如果不是匿名映射,而是映射到一个文件,这样在 Linux 里面,每个打开的文件都有一个 struct file 结构,里面有一个 file_operations,用来表示和这个文件相关的操作。如果是我们熟知的 ext4 文件系统,调用的是 thp_get_unmapped_area。如果我们仔细看这个函数,最终还是调用 mm_struct 里面的 get_unmapped_area 函数。殊途同归。

 PGD、P4G、PUD、PMD、PTE四级页表的概念如下:

用户态内存映射,Linux,linux

pgd_t 用于全局页目录项,pud_t 用于上层页目录项,pmd_t 用于中间页目录项,pte_t 用于直接页表项。

一个进程的虚拟地址空间包含用户态和内核态两部分。为了从虚拟地址空间映射到物理页面,页表也分为用户地址空间的页表和内核页表,这就和上面遇到的 vmalloc 有关系了。在内核里面,映射靠内核页表,这里内核页表会拷贝一份到进程的页表。

cr3 是 CPU 的一个寄存器,它会指向当前进程的顶级 pgd。如果 CPU 的指令要访问进程的虚拟内存,它就会自动从 cr3 里面得到 pgd 在物理内存的地址,然后根据里面的页表解析虚拟内存的地址为物理内存,从而访问真正的物理内存上的数据。

这里需要注意两点。第一点,cr3 里面存放当前进程的顶级 pgd,这个是硬件的要求。cr3 里面需要存放 pgd 在物理内存的地址,不能是虚拟地址。因而 load_new_mm_cr3 里面会使用 __pa,将 mm_struct 里面的成员变量 pgd(mm_struct 里面存的都是虚拟地址)变为物理地址,才能加载到 cr3 里面去。

第二点,用户进程在运行的过程中,访问虚拟内存中的数据,会被 cr3 里面指向的页表转换为物理地址后,才在物理内存中访问数据,这个过程都是在用户态运行的,地址转换的过程无需进入内核态。

只有访问虚拟内存的时候,发现没有映射到物理内存,页表也没有创建过,才触发缺页异常。进入内核调用 do_page_fault,一直调用到 __handle_mm_fault,这才有了上面解析到这个函数的时候,我们看到的代码。既然原来没有创建过页表,那只好补上这一课。于是,__handle_mm_fault 调用 pud_alloc 和 pmd_alloc,来创建相应的页目录项,最后调用 handle_pte_fault 来创建页表项。

为了加快映射速度,我们不需要每次从虚拟地址到物理地址的转换都走一遍页表。

用户态内存映射,Linux,linux

页表一般都很大,只能存放在内存中。操作系统每次访问内存都要折腾两步,先通过查询页表得到物理地址,然后访问该物理地址读取指令、数据。

为了提高映射速度,我们引入了 TLB(Translation Lookaside Buffer),我们经常称为快表,专门用来做地址映射的硬件设备。它不在内存中,可存储的数据比较少,但是比内存要快。所以,我们可以想象,TLB 就是页表的 Cache,其中存储了当前最可能被访问到的页表项,其内容是部分页表项的一个副本。

有了 TLB 之后,地址映射的过程就像图中画的。我们先查块表,块表中有映射关系,然后直接转换为物理地址。如果在 TLB 查不到映射关系时,才会到内存中查询页表。

此文章为11月Day5学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。文章来源地址https://www.toymoban.com/news/detail-745021.html

到了这里,关于用户态内存映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux防火墙firewalld不生效,无法拦截Docker映射端口

    今天出现了一个奇怪的现象,centos服务器上的防火墙(firewall)没有开放8103端口,但是依然可以访问 服务器开放的端口如下: 可以看出并没有开放8103端口 开放的服务如下: 也没有开放某三维系统,但可以正常访问 重启过防火墙,重启过服务器,仍未解决此现象。真是脑阔疼

    2024年02月04日
    浏览(80)
  • Linux的常用命令和配置Host文件对虚拟机IP快速映射

    基础四大命令 ls命令: ls -alh 参数 -a : 展示出隐藏文件 .开头就是隐藏文件 参数 -l : 以详细信息展示文件 我常用ll 代替 ls-l的命令 参数 -h : 显示文件大小,但是搭配方式是 ls -lh cd命令: 用来切换路径cd 后面加上路径 example: cd / 进入根目录 pwd命令: 查看当前路径 ifconfig命令: 查看

    2024年04月11日
    浏览(31)
  • Linux环境搭建SVN服务器并实现公网访问 - cpolar端口映射

    转载自远程内网穿透的文章:Linux搭建SVN服务器,并内网穿透实现公网远程访问 由于文档资料越来越多,将所有资料都存放在自己的电脑上容易混淆,并且也不利于分享。这种情况下,考虑将资料上传SVN统一管理,这样一来其他人也能很方便的查略各种资料。 当SVN安装在局域

    2024年02月04日
    浏览(45)
  • Linux内存管理--smaps内存

    swaps文件是Linux的proc文件系统提供的查看系统下运行进程内存使用情况的方法,Linux给每个进程都提供了一个这样的文件,学会查看并分析swaps文件有助于定位和解决诸如内存泄漏、性能瓶颈等内存资源相关问题。 了解smaps文件之前,需要先搞清楚Linux内存管理中的虚拟内存(

    2024年02月09日
    浏览(36)
  • 【Linux内核】内存管理——内存回收机制

    转载请注明: https://www.cnblogs.com/Ethan-Code/p/16626560.html 前文提到malloc的内存分配方式,malloc申请的是虚拟内存,只有在程序去访问时,才会触发缺页异常进入内核态,在缺页中断函数中建立物理内存映射。 如果物理内存充足,则直接建立页框与页的映射。当物理内存不足时,内

    2023年04月09日
    浏览(33)
  • 解放Linux内存:释放缓存(linux释放缓存)

    随着软件越来越复杂,内存变得越来越宝贵。尤其是在Linux系统上,内存管理策略十分重要。它不仅可以帮助系统保持高效运行,而且也能够让程序有更多的空间来运行,避免系统出现假死和其他性能问题。 在Linux系统中,释放缓存是最常用的一种内存释放方式。正常的内存

    2024年02月15日
    浏览(35)
  • 【Linux】Linux 之用户管理

    Linux 是一个多用户的系统,我们可以多个用户同时登陆 Linux,在 Linux 中用户有三种角色: 超级用户 : root 拥有对系统的最高的管理权限 ID=0 普通用户 :(普通用户又包含系统用户和本地用户) 系统用户 UID: 1 − 999 1-999 1 − 999 (Centos7 版本)、 1 − 499 1-499 1 − 499 (Cent

    2024年02月07日
    浏览(21)
  • 【Linux实践室】Linux用户管理实战指南:新建与删除用户操作详解

    🌈个人主页: 聆风吟_ 🔥系列专栏: Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 恭喜你已经完成了前面的内容,接下来让我们一起来学习 Linux 中用户的管理,本关主要讲解如何在 Linux 中创建和删除用户。 本关的任务是新创建一个新用户,并将一

    2024年03月24日
    浏览(34)
  • Linux 内核学习 3 - 虚拟内存和物理内存

    虚拟内存其实是 CPU 和操作系统使用的一个障眼法,联手给进程编织了一个假象,让进程误以为自己独占了全部的内存空间 : 在 32 位系统中,进程以为自己独占了 3G 的内存空间。 在 64 位系统中,进程以为自己独占了 128T 的内存空间。 这么做的好处是,操作系统为每个进程

    2024年01月21日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包