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

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

3天内不再提示

让我们一起来探索反向映射这个知识点

Linux阅码场 来源:Linuxer 作者:Linuxer 2020-09-18 10:31 次阅读

反向映射的目的是为了找到所有映射到某一个页面的页表项,从而可以对目标页做一些操作,比如切断映射。

反向映射一直是一个非常神奇的存在,今天我们就好好探索一下这个知识点。

创建

在反向匿名映射中除了page struct,一共有三个相关的数据结构:

vm_area_struct

anon_vma

anon_vma_chain

第一个数据结构我们已经见过了,是一个老朋友。而后两者就是为了构造反向匿名映射而新生的。我们先来看看这两个新的数据结构的样子。

anon_vma

anon_vma +----------------------------+ |root | = self |parent | = self | (struct anon_vma*) | |refcount | = 1 | (atomic_t) | |degree | = 1 | (unsigned) | +----------------------------+

这个结构由anon_vma_alloc()函数统一生成,上图中也显示了创造出来时候的样子。从这里看,也就是个带有上下级关系的这么一个结构。

anon_vma_chain

anon_vma_chain +----------------------------+ |vma | | (struct vm_area_struct*)| |anon_vma | | (struct anon_vma*) | | | |rb | | (struct rb_node) | |same_vma | | (struct list_head) | +----------------------------+

这个结构由anon_vma_chain_alloc()统一创建,貌似创建完了也不需要初始化,拿来后面就直接用了。

组合

到这里,大家应该感觉怪怪的,都不知道这些东西是个啥。别急,我把这些东西组合起来,可能你就会有一些感觉了。

在这里,我们把这三个重要的数据结构之间的组合关系展现给大家。当然这只是最简单的组合关系,目的是为了让大家能有一个感性的认识。

anon_vma_chain链接了anon_vma和vma

vma则会有指针指向自己的anon_vma

空口无凭,眼见为实。那为什么会长成这样的呢?接下来我们就来看看在内核中我们是如何将这些数据结构链接起来的。

链接

上一节的最后,我们看到了三个重要的数据结构通过链表和树连接在了一起,这一节我们就来看看他们是怎么连接起来的。

anon_vma_chain_link

往简单了讲,要连接这三个重要的数据结构,都靠一个函数:anon_vma_chain_link(vma, avc, anon_vma)。而这个函数本身简单到令人发指,以至于我能把整个定义给大家展示出来。

staticvoid anon_vma_chain_link(struct vm_area_struct *vma, struct anon_vma_chain *avc, struct anon_vma *anon_vma) { avc->vma = vma; avc->anon_vma = anon_vma; list_add(&avc->same_vma, &vma->anon_vma_chain); anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); }

你对照这上面的图一看,和图上显示的一摸一样没有任何多余的步骤。

但是,关键的但是来了,如果你以为一切就这这么简单,那就too young toosimple了啊。

接下来我们将从anon_vma_chain_link函数被调用的关系入手,去看看在实际运行中究竟会演化出什么样的变化来。

do_anonymous_page

首先出场的是函数do_anonymous_page,这个函数是在匿名页缺页中断时会调用的函数。

do_anonymous_page(vmf) __anon_vma_prepare(vma) avc = anon_vma_chain_alloc() anon_vma = find_mergeable_anon_vma(vma) anon_vma = anon_vma_alloc() vma->anon_vma = anon_vma anon_vma_chain_link(vma, avc, anon_vma)

从上面的流程可以看出,当发生缺页中断时,内核会给对应的vma构造anon_vma,并且利用avc去链接这两者。这种可以说是系统中最简单的例子,也是上图中显示的情况。

细心的人可能已经看到了,上面有一种情况是find_mergeable_anon_vma。如果这个函数返回一个可以重用的anon_vma,那么内核就可以利用原有的anon_vma了。此时这个图我们可以画成这样。

....................... ************************* . . * * av v avc v v vma v +-----------+ +-------------+ +-------------+ | |<------------|anon_vma vma|------------>| | | |<- | | | | +-----------+ +-------------+ +-------------+ ^ ^ ^ ^ . . * * . . ************************* . . . . . . ************************* . . * * . avc v v vma v . +-------------+ +-------------+ . ------|anon_vma vma|------------>| | . | | | | . +-------------+ +-------------+ . ^ ^ ^ . . * * ....................... *************************

其实此处我画得不够精确,av 和 avc之间应当是树的关系,而不是现在显示的链表的关系。但是我想意思已经表达清楚,即在一个进程中多个vma可以共享同一个anon_vma作为匿名映射的节点。

anon_vma_fork

看过了在单个进程中的情况,接下来我们来看看创建一个子进程时如何调整这个数据结构。这个过程由anon_vma_fork处理。

anon_vma_fork(vma, pvma) anon_vma_clone(vma, pvma) anon_vma = anon_vma_alloc() avc = anon_vma_chain_alloc() anon_vma->root = pvma->anon_vma->root anon_vma->parent = pvma->anon_vma vma->anon_vma = anon_vma anon_vma_chain_link(vma, avc, anon_vma)

这个函数很有意思,我还真是花了些时间去理解它。最开始有点看不清,所以我干脆退回到最简单的状态,也就是当前进程是根进程的时候。此时我才大致的了解了一点fork时究竟发生了什么。

话不多说,还是用一个图来表达

....................... ************************* . . * * av v avc v v vma v +-----------+ +-------------+ +-------------+ P | |<------------|anon_vma vma|------------>| | | |<----+ | | | | +-----------+ +-------------+ +-------------+ ^ ^ ^ ^ . . * * . . ************************* . . . . . . . . . . ************************* . . * * . avc v v * . +-------------+ * . |anon_vma vma| * . | | * . +-------------+ * . ^ ^ * . . * * ...................... * * * * * * * * ....................... * * . . * * av v avc v v vma v +-----------+ +-------------+ >+-------------+ C1 | |<------------|anon_vma vma|------------>| | | | | | | | +-----------+ +-------------+ +-------------+ ^ ^ ^ ^ . . * * ....................... *************************

P是父进程,C1是他的一个子进程。当发生fork时,page->mapping没有发生改变,所以依然需要能够从父进程的anon_vma上搜索到对应的页表。此时就得在父进程的rb_root树中保留一个子进程的avc。同时子进程又拥有自己的一套anon_vma。

可以说这个真的是非常有意思的。

对了,代码中还有一个函数anon_vma_clone,在这里我就不展开了。留给大家下来思考一下下。

使用

好了,到了这里我们已经拥有了一个非常强悍的武器 – 匿名反向映射。有了他我们就可以指哪打哪了。

内核也已经给我们准备好了扣动这个核武器的板机 – rmap_walk_anon。

rmap_walk_anon(page, rwc, true/false) anon_vma = page_anon_vma(page), get anon_vma from page->mapping pgoff_start = page_to_pgoff(page); return page_to_index(page) pgoff_end = pgoff_start + hpage_nr_pages(page) - 1; anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, pgoff_start, pgoff_end) rwc->rmap_one(page, vma, address, rwc->arg) -> do the real work

有了上面的基础知识,我想看这段代码就不难了。还记得上面看到过的那个rb_root么?对了,我们就是沿着这颗红黑树找到的vma,然后再找到了页表。

嗯,一切都感觉这么的完美。

原文标题:图解内存匿名反向映射reverse mapping

文章出处:【微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

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

    关注

    2

    文章

    268

    浏览量

    44390
  • AVC
    AVC
    +关注

    关注

    0

    文章

    21

    浏览量

    10965
  • 映射
    +关注

    关注

    0

    文章

    44

    浏览量

    15755

原文标题:图解内存匿名反向映射reverse mapping

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

收藏 人收藏

    评论

    相关推荐

    模拟电子技术知识点问题总结概览

    给大家分享模拟电子技术 知识点问题总结。
    的头像 发表于05-08 15:16 880次阅读
    模拟电子技术<b class='flag-5'>知识点</b>问题总结概览

    #新开端、新起点,2024一起加油#

    ;2024 一起加油\"则表达了大家共同努力,相互支持的决心和信念。 在2024年,无论你的目标是什么,都希望你能保持这种积极的心态,勇敢地面对挑战,不断地学习和进步。同时,也希望大家能够相互鼓励,共同前进, 一起创造更美好的未来。 所以,
    发表于02-26 21:01

    浅谈初级电工必备知识点

    对于初学电工的朋友来说,掌握 些基础且实用的 知识点是非常重要的。本文旨在分享初级电工应该掌握的核心 知识,帮助新手电工更好地入门和提升技能。
    的头像 发表于12-26 10:44 760次阅读

    TCP协议面试常问知识点总结

    TCP 作为传输层的协议,是 个IT工程师素养的体现,也是面试中经常被问到的 知识点。在此,我将 TCP 核心的 些问题梳理了 下,希望能帮到各位。
    的头像 发表于12-15 10:38 599次阅读
    TCP协议面试常问<b class='flag-5'>知识点</b>总结

    数字电位计知识点

    德赢Vwin官网 网站提供《数字电位计 知识点.pdf》资料免费下载
    发表于11-24 16:08 7次下载
    数字电位计<b class='flag-5'>知识点</b>

    三菱和西门子PLC输入接线知识点

    三菱和西门子PLC输入接线 知识点
    的头像 发表于11-21 10:01 572次阅读
    三菱和西门子PLC输入接线<b class='flag-5'>知识点</b>

    OFDM技术知识点

    德赢Vwin官网 网站提供《OFDM技术 知识点.rar》资料免费下载
    发表于11-18 14:25 0次下载
    OFDM技术<b class='flag-5'>知识点</b>

    Linux文件系统知识点详解

    今天浩道跟大家分享关于Linux文件及目录属性 知识点的硬核干货,可以说只要你认真看完这篇文章内容,其相关 知识点都不在话下,感兴趣又想快速掌握的小伙伴们,可以收藏 起来随时查看!
    的头像 发表于11-02 09:29 534次阅读
    Linux文件系统<b class='flag-5'>知识点</b>详解

    51单片机的知识点

    德赢Vwin官网 网站提供《51单片机的 知识点.pdf》资料免费下载
    发表于11-01 17:32 2次下载

    这个知识不太冷』探索5G射频技术(上)

    这个 知识不太冷』系列 ,旨在 帮助小伙伴们唤醒 知识的记忆, 将挑选 部分 Qorvo划重点的 知识点,结合产业现状解读,以此温故知新、查漏
    的头像 发表于10-26 15:15 443次阅读
    『<b class='flag-5'>这个</b><b class='flag-5'>知识</b>不太冷』<b class='flag-5'>探索</b>5G射频技术(上)

    机器视觉与视觉检测知识点的归纳

    德赢Vwin官网 网站提供《机器视觉与视觉检测 知识点的归纳.pdf》资料免费下载
    发表于10-07 16:39 3次下载
    机器视觉与视觉检测<b class='flag-5'>知识点</b>的归纳

    电阻的相关知识点

    整理成 份文件资料,用作对 些想要提高电路设计工作技能的研发工程师学习,芯片哥相信很少工程师能做到;那么电阻的相关 知识点都有哪些呢?
    的头像 发表于09-13 10:19 1290次阅读
    电阻的相关<b class='flag-5'>知识点</b>

    CMOS反向器的输出端可以连在一起吗?

    ,有时候 我们需要将CMOS 反向器的输出端连接在 一起来实现某种功能,尤其是在设计数字逻辑电路时。那么,CMOS 反向器的输出端能否连在 一起呢?本
    的头像 发表于09-12 10:51 1153次阅读

    分享芯片行业有趣的小知识

    随着拜登签署《芯片与科学家法案》,全球芯片争夺战进 步升温,我国芯片市场再次面临霸权主义的挑战。尽管困难重重, 我们决不会停止在芯片领域的 探索与发展,这彰显了芯片对国家的至关重要性。除了其重要性,芯片还有许多有趣的小
    的头像 发表于09-11 15:38 751次阅读

    smt回流焊工艺知识点

    smt回流焊工艺 知识点
    的头像 发表于09-06 10:18 700次阅读