一直想把oprofile在板子上跑起来,一直没时间来做,最近有空,就来做看看
1.Google
找到有用资源
1) comcat的oprofile补丁,基本全齐了,虽然是for godson的
a) 照补丁添加kernel里面的内容,也就是添加个c文件,另外注意就是cpu_type,由于我们的IC design人员没改,所以prid读出来还是CPU_4KEC,所以只能丑陋地加了个#ifdef SOC_XXX
case CPU_4KEC:
.....
另外我们的performance counter不是用的cp0里的,4kec没有,只有24k有,所以用的外部的SRAM寄存器,具体实现原理,IC那块不懂,应该是比cp0的有误差。performance counter有几个不爽,一是两个counter居然所有事件是一模一样的,真是浪费,二是居然没有bit位区分 user, kernel,只有exl,erl位,虽然也可以利用exl和erl来作为kernel态的判断,但由于linux还用了其他另外一种方式区分内核态,所以不准
b) 用户态补丁,依葫芦画瓢
2.编译
内核 pass
oprofile不过
郁闷,继续Google,找到资源
《OProfile交叉编译》和 《OProfile交叉编译续》
原来差popt和bfd,liberty
下载popt交叉编译,pass
下载binutils交叉编译,出错,整半天,不成,怒,用debian直接下了个binutils的.deb解开,再编译oprofile OK!
3.运行
1) 怎么老打warning,说mount /dev/oprofile busy
打开opcontrol看,就是个脚本,原来去查/etc/mtab了,懒得重新编译busybox,将它修改成了/proc/mounts
2) go on, 发现profiled不起来,检查在opcontrol里
verify_counters返回了
返回原因是$OPHELP --check-event $OPHELP_ARGS -callgrach ....命令返回出错就退出了,整不明白,注释掉,应该影响不大
3) go on, 可以了,不过又发现怎么opcontrol --shutdown不掉啊
打开opcontrol,原来用了kill -s 0来判断进程,改成kill -0
大功告成!
1.Google
找到有用资源
1) comcat的oprofile补丁,基本全齐了,虽然是for godson的
a) 照补丁添加kernel里面的内容,也就是添加个c文件,另外注意就是cpu_type,由于我们的IC design人员没改,所以prid读出来还是CPU_4KEC,所以只能丑陋地加了个#ifdef SOC_XXX
case CPU_4KEC:
.....
另外我们的performance counter不是用的cp0里的,4kec没有,只有24k有,所以用的外部的SRAM寄存器,具体实现原理,IC那块不懂,应该是比cp0的有误差。performance counter有几个不爽,一是两个counter居然所有事件是一模一样的,真是浪费,二是居然没有bit位区分 user, kernel,只有exl,erl位,虽然也可以利用exl和erl来作为kernel态的判断,但由于linux还用了其他另外一种方式区分内核态,所以不准
b) 用户态补丁,依葫芦画瓢
2.编译
内核 pass
oprofile不过
郁闷,继续Google,找到资源
《OProfile交叉编译》和 《OProfile交叉编译续》
原来差popt和bfd,liberty
下载popt交叉编译,pass
下载binutils交叉编译,出错,整半天,不成,怒,用debian直接下了个binutils的.deb解开,再编译oprofile OK!
3.运行
1) 怎么老打warning,说mount /dev/oprofile busy
打开opcontrol看,就是个脚本,原来去查/etc/mtab了,懒得重新编译busybox,将它修改成了/proc/mounts
2) go on, 发现profiled不起来,检查在opcontrol里
verify_counters返回了
返回原因是$OPHELP --check-event $OPHELP_ARGS -callgrach ....命令返回出错就退出了,整不明白,注释掉,应该影响不大
3) go on, 可以了,不过又发现怎么opcontrol --shutdown不掉啊
打开opcontrol,原来用了kill -s 0来判断进程,改成kill -0
大功告成!