perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑
2017-03-21 23:39
246 查看
该标题可以抽象出来的问题是:两个前开后闭的区间 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中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要做出调整。
两个区域重叠无非是下面几种情况,对每种情况分别说明是如何调整的:
相关文章推荐
- 基于jQuery判断两个元素是否有重叠部分的代码
- 基于jQuery判断两个元素是否有重叠部分的代码
- php 判断访客是否为搜索引擎蜘蛛的函数代码
- js判断输入是否为正整数、浮点数等数字的函数代码
- javascript判断函数参数是否传递[比较运算符中的两个等号与三个等号差别]
- 计算两个整数区间是否重叠的算法函数
- PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
- 判断两个对象是否相等的js函数
- 判断两个字符串是否相似的函数 AnsiResemblesText 专题研究
- 如何判断两个链表是否相交,以及交点
- 如何判断两个矩形是否有重叠部分?(某公司校园招聘笔试试题)
- 写了两个判断文件目录是否存在的函数
- js判断输入是否为正整数、浮点数等数字的函数代码
- 函数-判断两个关键字是否存在包含关系
- 判断两个对象是否相等的js函数
- 纯js集成fck 以及 判断fck内容是否为空的js代码
- 在delphi中判断字符串是否数字,以及精度处理函数
- webex js 判断是否是ie 以及兼容性代码
- C语言两个时间段是否交叉的判断函数
- php中判断文件空目录是否有读写权限的函数代码