博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑
阅读量:4698 次
发布时间:2019-06-09

本文共 829 字,大约阅读时间需要 2 分钟。

该标题可以抽象出来的问题是:两个前开后闭的区间 rangeA 和 rangeB,如何判断这两个区间是否重叠。这个问题在内核中非常重要,虚拟地址空间的划分需要它,perf中map_group的构建也需要它,下面直接给出该问题的解决思路:

找出不重叠的情况,其他的情况都是重叠的,perf中mmap__overlay函数是这样解决的:

int map__overlap(struct map *l, struct map *r)

{
    if (l->start > r->start) { //首先对调,让l指向偏左,即起始地址较小的map【用一个数轴比划下】
        struct map *t = l;
        l = r;
        r = t;
    }  
    if (l->end > r->start) //那么只要左边map的结束地址超过了右边map的起始地址,就肯定重叠
        return 1;
    return 0;
}
现在第一个问题解决了,下面解决第二个问题:map_groups__fixup_overlappings函数解析:

函数原型:int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map, FILE *fp)

参  数     :mg,存放已经注册好的map,使用二叉树存储;

                 map,待插入的map,根据该map来调整mg中已经注册的map;

                 fp,错误输出地。

函数名描述了这个函数的功能:根据重叠信息,对map_groups中已有的map进行修正。修正的原则是后来居上。什么意思?也就是说当map与mg中的某个map_registered的内存域发生了冲突,此时map的优先级更高一些,mg_registered要做出调整。

两个区域重叠无非是下面几种情况,对每种情况分别说明是如何调整的:

 

转载于:https://www.cnblogs.com/honpey/p/4587510.html

你可能感兴趣的文章
HIve:beeline终端上在输错hive语句时,无论 Backspace还是delete 都删除不掉错误的语句,没有办法退格...
查看>>
Android 微光闪烁效果之更强Shimmer-android
查看>>
Open Graphics Library初步_搭建环境_GLUT
查看>>
MySQL5.7版本安装
查看>>
转 android有用代码片段
查看>>
LeetCode-Recover Binary Search Tree
查看>>
Socket
查看>>
opencv 在工业中的应用:blob分析
查看>>
JavaScript Cookie
查看>>
JAVA中protected的作用
查看>>
selenium python 启动Chrome
查看>>
MySQL优化索引及优化汉字模糊查询语句
查看>>
安装cocoaPod 的问题
查看>>
vs Obsolete标识符
查看>>
IOS 深拷贝和浅拷贝应用
查看>>
深度学习优化方法
查看>>
《剑指offer》第二十八题(对称的二叉树)
查看>>
解决编译错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
查看>>
别说我不懂排序!几种常见排序算法(一)
查看>>
JAVA学习笔记-this隐式参数
查看>>