LINUX内核阅读----不懂这个,说明你没看懂内核,
void profile_hit(int type, void *__pc)
{
unsigned long pc;
if (prof_on != type || !prof_buffer)
return;
pc = ((unsigned long)__pc - (unsigned long)_stext) >> prof_shift;
atomic_inc(&prof_buffer[min(pc, prof_len - 1)]);
}
这个函数是在阅读LINUX2.6.16的主调度函数schedule时碰到的,相信各位也会碰到.
profile用于优化代码,辅助识别"hot spots",但是这个函数实现何功能,哪位大虾可以解释一下!谢谢,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
学习了!
_stext是kernel第一条指令的开始地址
这个标题有点过了,有问题大家一起讨论,没必要提这样的标题吸引眼球。
内核版本2.6.18-RC7
profile只是内核的一个调试性能的工具,这个可以通过menuconfig中的Instrumentation Support->profile打开。
1. 如何使用profile:
首先确认内核支持profile,然后在内核启动时加入以下参数:profile=1或者其它参数, 新的内核支持profile=schedule 1
2. 内核启动后会创建/proc/profile文件,这个文件可以通过readprofile读取,
如readprofile -m /proc/kallsyms | sort -nr > ~/cur_profile.log,
或者readprofile -r -m /proc/kallsyms |sort -nr,
或者readprofile -r && sleep 1 && readprofile -m /proc/kallsyms |sort -nr >~/cur_profile.log
3. 读取/proc/profile可获得哪些内容?
根据启动配置profile=?的不同,获取的内容不同:
如果配置成profile=? 可以获得每个函数执行次数,用来调试函数性能很有用
如果设置成profile=schedule ?可以获得每个函数调用schedule的次数,用来调试schedule很有用
profile的实现:
在内核中创建一个/proc/profile接口,在系统启动时用profile_init()分配好存放profile信息的内存,每条指令都有一个计数器。
如果设置的是profile=? 统计每条指令执行的次数。在时钟中断中调用 profile_tick(CPU_PROFILING, regs),将当前指令regs->eip的计数值+1。这个统计有点不准,因为一个jiffies之间,可能执行很多函数,而统计的只是恰好发生时钟中断时的那个函数。但取样点多了,这些信息还是能说明问题。
如果设置的是profile=schedule ? 统计每个指令调用schedule()的次数,在schedule()中调用profile_hit(SCHED_PROFILING, __builtin_return_address(0));
其实真正调用schedule的指令只有有限的几个,但这些信息可以获得调度点的精确信息。
profile_hit()的作用是将当前指令的计数值加1
profile_tick()是在每个时钟tick的时候将响应的指令计数值加1
time_hook 一般被其它profile工具,如oprofile用来在每次中断发生时,添加自己的处理函数。
profile信息其实包括任务的所有统计信息,所以可以用profile_event_register()在任务退出或者用户空间内存释放时,挂载自己的回调函数,以统计这些信息。
profile信息的统计在smp和up下不同,即profile_hit的实现不同,smp的实现中有一个PerCPU cache,这可避免多个CPU在profile统计时效率低下问题。具体可以察看源代码kernel/profile.c, 可以看看driver/oprofile的实现。
欢迎楼下的继续拍砖。
尽管还是似懂非懂,
能再问一下, profile_hit函数中
((unsigned long)__pc - (unsigned long)_stext)
是计算的什么,谢谢!(_PC是CALLER地址,而_stext是什么,)
统计他的CALLER是在哪里被调用的最多。
以后还有很多问题要向大家请教.
看了一下以前的贴子,发现这里高人很多.
我现在这个问题没人感兴趣吗?
PROFILE_HIT函数是在PROFILE.C文件,LINUX2.6版,跟它同类的函数还有
profile_tick( ),
profile_cpu_callback()等,
请问这些函数实现什么功能的,尤其是PROFILE_HIT()
哪位大虾不吝赐教啊!