perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑
Posted honpey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑相关的知识,希望对你有一定的参考价值。
该标题可以抽象出来的问题是:两个前开后闭的区间 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要做出调整。
两个区域重叠无非是下面几种情况,对每种情况分别说明是如何调整的:
以上是关于perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑的主要内容,如果未能解决你的问题,请参考以下文章
Overlapping rectangles判断两个矩形是否重叠的问题 C++
c_cpp 两个轴对齐矩形是否重叠,以及计算两个轴对齐矩形的重叠比例。具体算法说明,请参见http://blog.csdn.net/qianchenglenger/article/details/50