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

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

3天内不再提示

mlock如何锁住进程地址空间关联的物理内存

Linux阅码场 来源:Linux阅码场 作者:Linux阅码场 2022-03-14 09:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。 本文的分析基于arm64处理器架构,内核版本为Linux-5.10.27,我们会结合重点内核源代码来解析mlock是如何做到锁住进程地址空间关联的物理内存的,又是如何防止相关的物理页面被交换出去的。

一、主动缺页

mlock的主要代码处理流程如下,这里我们主要关注主动缺页部分:

6808a960-9fc5-11ec-952b-dac502259ad0.png

mlock处理路径中,会将VM_LOCKED标志加入到vma->vm_flags中(由于设置的地址区域有可能跨越多个vma,所以代码中会涉及到分裂和合并的操作,实质上都会设置相关的vma->vm_flags的VM_LOCKED标志),然后会调用__mm_populate来填充虚拟页对应的物理页,最终在faultin_page函数中试图查找vma中的每个虚拟页对应的物理页面(对应于follow_page_mask函数),如果没有找到会调用handle_mm_fault主动触发缺页处理。 handle_mm_fault函数是内核通用的缺页异常处理例程,如vma是匿名映射的则分配物理页面然后建立页表映射关系,vma是文件映射则会从磁盘读取对应的文件页(如果page cache没有对应页面时)到内存的page cache,然后建立虚拟页面建立页表映射关系。

二、内存回收处理

1. 扫描活跃的lru链表

内存回收扫描活跃的lru链表时,对于设定了VM_LOCKED的vma处理链路如下:

68239090-9fc5-11ec-952b-dac502259ad0.png

可以看到:当扫描活跃的lru链表的时候,会通过反向映射机制查找到映射这个物理页面的每个vma, 对于设置了vma->vm_flags 的VM_LOCKED标志的vma来说直接退出反向映射处理即可,不需要进行访问计数的统计工作,本身这样的物理页面就需要常驻内存不要进行回收。

2.扫描不活跃的lru链表

内存回收扫描不活跃的lru链表时,对于设定了VM_LOCKED的vma处理链路如下:

6836084c-9fc5-11ec-952b-dac502259ad0.png

可以看到:调用链中也会调用page_referenced 函数通过反向映射机制查找到映射这个物理页面的每个vma, 对于设置了vma->vm_flags 的VM_LOCKED标志的vma来说直接退出反向映射处理即可,返回到page_check_references函数时,判断如果有vma设置了VM_LOCKED标志就会返回PAGEREF_RECLAIM到shrink_page_list函数接着处理。 shrink_page_list函数在处理完page_check_references之后,就进行回收处理,对于页表映射页会调用try_to_unmap来解除页表映射。

3.反向映射处理

shrink_page_list在回收物理页面之前会调用try_to_unmap来解除映射到这个页面所有页表项,相关处理如下:

684fd8bc-9fc5-11ec-952b-dac502259ad0.png

对于映射到这个物理页的每个vma来说,如果vma->vm_flags设置了VM_LOCKED标志,则会调用mlock_vma_page来做mlock处理,然后返回false,结束反向映射处理。 下面我们来看mlock_vma_page做了什么事情:

6867d480-9fc5-11ec-952b-dac502259ad0.png

可以看到:mlock_vma_page首先设置页描述符的PG_mlocked标志,然后会zone的NR_MLOCK页面记账,然后会将页面从原来的lru链表中隔离出来,最后会将页面加入不可回收的lru中(这个代码大家自行阅读,实际上是判断页描述符的PG_mlocked标志)。

mlock_vma_page处理的重点就是将页面加入到不可回收的lru链表,这样内存回收的时候就不会在扫描到这样的页面了。

mlock的整个过程如下图所示:

6887a3aa-9fc5-11ec-952b-dac502259ad0.png

三、munlock处理

munlock会解除原来锁住的页面,处理路径如下:

68bf2c58-9fc5-11ec-952b-dac502259ad0.png

当然代码中也会有对应的vma的分裂处理,主要处理为:清除vma的VM_LOCKED标志,清除页描述符的PG_mlocked标志,最后就会将原来在不可回收的lru中的页面重新加入对应的lru链表中。 这里还有一个细节,那就是有可能这个页面对多个vma共享,所以会通过try_to_munlock来处理,处理路径如下:

68d7e3e2-9fc5-11ec-952b-dac502259ad0.png

会通过反向映射机制,遍历这样页对应的所有vma,如果传递的ttu_flags为TTU_MUNLOCK且vma->vm_flags没有设置VM_LOCKED标志,则直接返回,检查下一个vma;如果有一个vma设置了VM_LOCKED标志,说明这个页面还不能被回收,就会通过mlock_vma_page函数重新将页面加入到不可回收的lru链表。 munlock的整个处理过程如下图:

68f2923c-9fc5-11ec-952b-dac502259ad0.png

四、总结

对于一些对时间有严格要求的应用场景,访问时按需分配和调页机制的时延可能是未知的,内核中提供了mlock相关的系统调用,用于将虚拟内存区域对应的物理页面“锁在”内存中。内核对应mlock锁住的页面实际上它主要做了两步比较重要的操作:1,调用mlock的时候就将所需要的物理页面准备好;2,内存回收时当扫描到相关的物理页面时,将其放入不可回收的lru链表。第一步保证访问的虚拟地址对应的物理页面在内存中,第二步保证了锁住的页面不会被回收。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9499

    浏览量

    388555
  • 内存
    +关注

    关注

    9

    文章

    3173

    浏览量

    76099

原文标题:mlock锁原理剖析

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问e203定义的地址空间是虚拟地址还是物理地址

    ; RED_LED_OFFSET); GPIO_REG为基地址,GPIO_OUTPUT_VAL为偏移量,从而确定了要操作的寄存器的绝对地址。 同样地,在做上电复位时,可以配置pc_rtvec使得程序从不同的内存空间启动。
    发表于 11-11 06:20

    如何为蜂鸟添加DDR内存扩展

    本队伍编号CICC3042,本文介绍如何为蜂鸟添加DDR内存扩展。一些需要大存储空间的设计中经常需要使用DDR,这时我们希望蜂鸟可以访问DDR,以实现更好的软硬件协同。 简单阅读蜂鸟的代码发现
    发表于 10-31 06:07

    通过sysmem接口扩展内存空间

    存储器的访问接口,在e203_subsys_mems.v文件中可以找到: 同时在这个源文件中实现了一主多从的总线系统,可以看到sysmem被分配到0x80000000到0xFFFFFFFF的地址空间
    发表于 10-24 08:12

    WebGL/Canvas 内存泄露分析

    的 JavaScript 对象未释放要复杂得多。一个现代 WebGL/Canvas 应用的内存版图实际上跨越了三个截然不同但又相互关联内存区域: 图 V8 引擎管理的 JavaScript 堆(JS Heap
    的头像 发表于 10-21 11:40 156次阅读
    WebGL/Canvas <b class='flag-5'>内存</b>泄露分析

    多线程与多处理有何区别

    多处理也称为进程进程是一个在自己的内存空间中运行的独立程序。
    的头像 发表于 09-16 14:21 376次阅读

    DSP仿真器下载报错,似乎是地址映射问题还是FLASH锁住

    dsp下载程序报错,仿真器连接是没错的,开发板为F28335,仿真器为XDS100v1,程序下载为仿真器时报错,问题还没有解决,请大神解答,下面是以为FLASH锁住了,然后自己去尝试解锁的报错。
    发表于 07-11 20:44

    工业APP频繁崩溃?聚徽厂家分享安卓工控机内存碎片化与进程管理优化指南

    进程管理两大核心维度,深入剖析崩溃根源,并提出系统性优化方案。 一、内存碎片化:工业APP崩溃的隐形推手 1. 内存碎片化的成因与危害 内存碎片化是指
    的头像 发表于 06-10 10:24 358次阅读

    golang内存分配

    以前 go 的堆地址空间是线性连续扩展的, 比如在 1.10(linux amd64)中, 最大可扩展到 512GB. 因为 go 在 gc 的时候会根据拿
    的头像 发表于 03-31 15:00 374次阅读
    golang<b class='flag-5'>内存</b>分配

    进程、线程、协程傻傻分不清?一文带你彻底扒光它们的\"底裤\"!

    :操作系统分配资源的最小单位,自带「独立户口本」(虚拟地址空间)和「保镖团队」(系统级资源)。 技术细节: 每个进程都有自己独立的内存空间(就像你家的房子,别人不能随便进) 创建
    发表于 03-26 09:27

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    本帖最后由 jf_13411809 于 2025-3-20 14:10 编辑 在Linux系统中,内核空间和用户空间是两个独立的地址空间,它们有不同的访问权限和
    发表于 03-20 11:50

    飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    在Linux系统中,内核空间和用户空间是两个独立的地址空间,它们有不同的访问权限和内存保护机制。在内核
    发表于 03-19 08:55

    江波龙推出7.2mm超小尺寸eMMC,拓展AI智能穿戴的物理空间

    ,为AI智能穿戴设备物理空间优化提供了全新的存储解决方案。极致小巧为穿戴设计创造更多可能面积减少了约65%|重量下降近67%7.2mm×7.2mm是目前市场上较小尺
    的头像 发表于 01-24 13:32 1202次阅读
    江波龙推出7.2mm超小尺寸eMMC,拓展AI智能穿戴的<b class='flag-5'>物理</b><b class='flag-5'>空间</b>

    IP地址数据信息和爬虫拦截的关联

    IP地址数据信息和爬虫拦截的关联主要涉及到两方面的内容,也就是数据信息和爬虫。IP 地址数据信息的内容丰富,包括所属地域、所属网络运营商、访问时间序列、访问频率等。 从IP地址信息中可
    的头像 发表于 12-23 10:13 671次阅读

    MAC地址的作用范围,MAC地址怎么申请?

    物理地址(PhysicalAddress),用于在网络中唯一标示一个网卡。以下是英利检测针对其作用范围及申请方式的详细解答:MAC地址的作用范围局域网内的设备定位
    的头像 发表于 12-19 17:44 2601次阅读
    MAC<b class='flag-5'>地址</b>的作用范围,MAC<b class='flag-5'>地址</b>怎么申请?

    如何使用内存加速存储访问速度

    本篇文章是首尔大学发表在FAST 2023上的文章。随着闪存容量的增加,逻辑地址物理地址的映射表项也相应增加。映射表项通常存放在设备控制器中的SRAM来加速访问。然而由于成本问题SRAM一直无法
    的头像 发表于 12-19 10:54 1046次阅读
    如何使用<b class='flag-5'>内存</b>加速存储访问速度