linux 逆向映射
逆向映射用于建立物理内存页和使用该页的进程的对应页表项之间的联系,在换出页时以便更新所有涉及的进程。得到物理页基址后,根据pfn_to_page可以将页框转换为page实例,page实例中的mapping成员,在映射匿名页面的时候该成员指向一个anon_vma结构,在映射文件页面的时候指向inode节点的address-space。这里简述一下匿名映射的情况:
一个物理页面可以同时被多个进程的虚拟地址内存映射,但一个虚拟页面同时只能有一个物理页面与之映射。不同虚拟页面同时映射到同一物理页面是因为子进程克隆父进程VMA,和KSM机制的存在。逆向映射实现的基础是通过struct anon_vma(简称AV)、struct anon_vma_chain(简称AVC)和sturct vm_area_struct(简称VMA)建立了联系,通过物理页面反向查找到VMA,这三个结构体的关系如下:
static void anon_vma_chain_link(struct vm_area_struct *vma, struct anon_vma_chain *avc, struct anon_vma *anon_vma) {
avc->vma = vma; //建立struct anon_vma_chain和struct vm_area_struct关联
avc->anon_vma = anon_vma; //建立struct anon_vma_chain和struct anon_vma关联
list_add(&avc->same_vma, &vma->anon_vma_chain);//将AVC添加到struct vm_area_struct->anon_vma_chain链表中。
anon_vma_interval_tree_insert(avc, &anon_vma->rb_root);//将AVC添加到struct anon_vma->rb_root红黑树中。
}
说一下匿名映射情况下如何通过page得到对应的pte:匿名映射的情况下page->mapping指向anon_vma结构,AVC通过红黑树结点链接到AV中,而AVC又指向VMA,遍历anon_vma->rb_root红黑树中的AVC,从AVC可以得到相应的VMA,因此通过page指向的anon_vma结构可以得到与该进程相关的所有vma。前面说到,由于子进程复制父进程的vma,因此多个不同子进程中的虚拟页面会同时映射到同一个物理页面,另外多个不相干进程虚拟页面也可以通过KSM机制映射到同一个物理页面。这两种情况下通过逆向映射解除对一个页面的映射的实现是不一样的。函数page_referenced会先判断页面的类型,如果是KSM页面走page_referenced_ksm。如果是匿名映射页,走page_referenced_anon,如果是文件映射页,走page_referenced_file(对于文件主要就是根据page->mapping->i_mmap得到相关的vma),page_referenced_ksm和page_referenced_anon的区别在于获取page对应的虚拟地址上存在差异。
对于page_referenced_anon,对应到前面说的多个不同子进程中的虚拟页面同时映射到同一个物理页面的情况,page->index为page对应的虚拟页框在对应vma中的偏移,因为子进程复制父进程的vma,因此他们对应的vma结构都是一样的,因此page->index在不同子进程的vma中的偏移都是一致的,故对于每个关联的vma,都通过vma_address(page, vma)便可以获取page在当前vma对应的虚拟地址,且通过vma可以得到mm,进一步得到pgd。通过pgd和虚拟地址,可以继续遍历页表得到pte,然后解除映射。
对于page_referenced_ksm,由于是不同进程的虚拟页面映射到同一个物理页面,因此page对应的虚拟页框在不同进程的vma中的偏移肯定是不一致的,这里就不能对每个vma都通过vma_address(page, vma)得到page对应的虚拟地址。内核中对于ksm页面,内核维护了一个结构体rmap_item,通过stable_node->hlist将使用了ksm页面的rmap_item连接起来。rmap_item中维护了page对应的虚拟地址address及anon_vma结构,基于此得到对应的vma,虚拟地址通过rmap_item得到,然后进一步解除映射。
共享内存方式的页如何通过逆向映射解除映射:应该是通过文件的方式,内核实现的shm共享内存会分配一个文件标识符,而mmap实现的共享内存要么是在父子进程之间,要么就是文件映射。
参考:https://www.cnblogs.com/arnoldlu/p/8335483.html
https://www.cnblogs.com/ck1020/p/6883061.html
linux 逆向映射的更多相关文章
- linux 逆向映射机制浅析
2017-05-20 聚会回来一如既往的看了会羽毛球比赛,然后想到前几天和朋友讨论的逆向映射的问题,还是简要总结下,免得以后再忘记了!可是当我添加时间……这就有点尴尬了……520还在写技术博客…… 闲 ...
- KVm中EPT逆向映射机制分析
2017-05-30 前几天简要分析了linux remap机制,虽然还有些许瑕疵,但总算大致分析的比较清楚.今天分析下EPT下的逆向映射机制.EPT具体的工作流程可参考前面博文,本文对于EPT以及其 ...
- 逆向映射是干嘛的anon_vma, vma, anon_vma_chain
逆向映射是为了从page得到进程信息,里面有三个比较重要的结构体: mm_area_struct, anon_vma_chain, anon_vma 想象一种复杂的场景 所以其实一个进程对应着很多an ...
- 【原创】ARMv8 MMU及Linux页表映射
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程
一.局域网内的 Linux 服务器上操作步骤: 1.安装samba(CentOS Linux): yum install samba system-config-samba samba-client ...
- Linux内存映射(mmap)系列(1)
看到同事的代码中出现了mmap.所以自己私下学习学习,研究研究..... http://www.cnblogs.com/lknlfy/archive/2012/04/27/2473804.html ( ...
- 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器
原文链接 samba client ubuntu redhat ubuntu gui tools 1,列出某个IP地址所提供的共享文件夹 smbclient -L 198.168.0.1 2,在s ...
- Linux内存映射--mmap函数
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...
- [转载]linux内存映射mmap原理分析【转】
转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...
随机推荐
- 【easy】226. Invert Binary Tree 反转二叉树
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- 关于Activity生命周期的总结
1.Acitivity的四种状态 (1)运行:位于Activity栈顶,用户可见,可获得焦点. (2)暂停:如果一个活动被另一个非全屏的活动所覆盖(比如一个Dialog),那么该活动就失去了焦点,它将 ...
- java第一个demo(简单登陆窗体)
首先新建一个Maven项目 选择一个存放项目的目录 ,点击完成(下图). 为了防止jdk版本的问题,所以在pom.xml里面做一个配置,让整个项目统一用jdk 1.8版本(1.7之前可能会存在一些问题 ...
- Xshell出现‘The remote SSH server rejected X11 forwarding request’解决办法
当准备用Xshell进行远程连接的时候出现下面的情况: 那么跟着我来点击鼠标就ojbk了: 文件--->属性--->隧道 然后找打 把那个单选框的对号勾掉,然后点击确认就OK了!!
- 微信小程序+java后台
博主是大四学生,毕业设计做的是微信小程序+java后台.陆陆续续经历了三个月(因为白天要实习又碰上过年玩了一阵子),从对微信小程序一无所知到完成毕设,碰到许多问题,在跟大家分享一下自己的经历和一个小程 ...
- java----JDOM解析XML
JDOM: 与DOM类似,基于树形结构 效率比DOM快 下载: http://www.jdom.org/dist/binary/jdom-2.0.6.zip 导包导java中的工程目录 jdom-2. ...
- element el-tree 添加图标
1.指定渲染函数:render-content="renderContent" <el-tree ref="tree" :data="funct ...
- Docker发布程序那些事
最近使用docker比较频繁,所以也难免碰到一些坑,在这里记录一下,给自己写个笔记 1.docker 1.13.0版本不支持docker stack deploy -c 多个 -c的yml文件合并 如 ...
- Codeforces 431E Chemistry Experiment 线段树 + 二分
Chemistry Experiment 维护一个权值线段树,然后二分答案. #include<bits/stdc++.h> #define LL long long #define LD ...
- es ik分词插件安装
1.ik下载(下载es对应版本的ik分词包) https://github.com/medcl/elasticsearch-analysis-ik/releases 2.mac cd /usr/loc ...