修改内核源码,使用的优麒麟15.04,内核版本为linux3.19
一步一步跟着做,一定可以实现看到在内核中添加的打印语句输出。
内核源码调试步骤
3部曲:
一,装个linux系统(我装的是双系统);
二,编译内核源码,使用新内核启动;
三,修改代码,重启。
步骤一,参考以下链接
http://jingyan.baidu.com/article/76a7e409bea83efc3b6e1507.html,(附录一,贴在最后)
需要注意的是,第8步的时候,把boot分区分大一些,200M会有点不够用(后面制作的启动映像会有点大),我分的1000M。
步骤二,参考以下链接
http://jingyan.baidu.com/article/0bc808fc4697af1bd585b957.html,(附录二,贴在最后)
是需要电脑可以联网的,因为有些更新程序,
4.# make menuconfig (对内核选项进行配置,不需要配置,直接退出,是否保存,选择no)
# cp /boot/config-'uname-r'-generic ./.config ('uname -r'-generic)
这一步需要注意,可能uname –r 用不了,那么就需要,输入cp/boot/config后按两下tab键看看里面有什么,然后把它复制到./.config 我的是
cp/boot/config-3.19.0-15-generic ./.config
步骤二做完后,其实已经是新内核启动了,现在我们来略微修改下代码,来重新启动。
步骤三,
1.查了一些资料在终端直接输出内核的printk似乎不好实现,我们只能采用一种取巧的方式,dmesg命令。
2.由于编译内核模块花的时间比较久,makemodules (编译模块),又采用了一种取巧的办法,由于我只修改了内核的kernel/sched/fair.c,所以我只需要把bzImage 编译了,然后拿到boot下面就可以了。这样为编译节省了大量的时间。
我把内核的解压缩文件放在 /usr/src下面。
cd /usr/src/linux-3.19.3/kerne/shed/
vi fair.c
加上头文件#include <linux/kernel.h>
是为了printk可以用
然后找到check_preempt_tick()函数,在里面加上一行
printk(“here ischeck_preempt_tick \n”);
因为进程时间用完以后,都会调用这个函数来选择新进程来运行,所以选择这个函数。
写完以后保存。
cd/usr/src/linux-3.19.3
sudo Make bzImage
成功后会提示生成了一个bzImage,把它拷贝到根目录的boot里面,重新七个名字,
cp arch/x86/boot/bzImage /boot/vmlinuz-3.19.3
然后 重新启动就可以了,相当于我们只编译了内核的镜像,modules都没变,所以很节约时间。
重启后,进入终端,输入dmesg ,就可以看到我们printk中的信息了。
这只是抛砖引玉,以后可以根据需要,在内核的不同地方增加printk信息。