学内核之九:学会偷懒,善用内核的调试日志

是什么在推动人类社会不断的发展?说的好听一点,可能是不断增加的需求;不好听一点呢,就是不断膨胀的欲望。欲望中的很大一部分就是让人可以更懒。

动物把有效时间都拿来觅食了,所以,动物不需要专门去锻炼。人类在满足基础需求后,衍生了很多其他需求,这其中就包括了懒人需求。智能家居、自动驾驶、机器人等等,很多首先是让人可以更懒。可见,学会偷懒,是需要一点技术投入的。

不过,话说回来,学会偷懒,可以让我们提升自己。因为,转换一下思路,学会偷懒,就是创新了,就是找到更有效率的方法,避免低水平的重复!

好了,废话说多了。回归正题。

学内核的过程中,避免不了看代码,调代码。有时候,将执行过程的参数和流程打印出来,可以帮助我们更快速的了解执行逻辑,也可以辅助我们更深入的理解代码。

那么,问题来了,如何添加日志?其实,在我们考虑添加自己的日志前,可以先看看内核是否留有日志相关的代码,只是没有打开而已。如果能够利用内核自带的日志代码,可以比较有效和快速的辅助我们理解代码逻辑。

最近在看内存相关的代码时,就发现不少这样的代码。下面举个例子。

 上面的memeblock.c代码中,有定义一个early_param,如果这个param的值为debug,那么memblock_debug就会被置为1。这个是通过注册一个关联处理函数early_memblock来实现的。

可以猜到,如果这个memblock_debug被设置了的话,这部分相关的处理日志就应该输出。还有一个好处,就是这个是通过参数来决定的,所以,不需要重新编译代码,这非常关键,很大程度上扩展了使用环境,减少了限制条件

那么,怎么打开这个开关呢?关于early_param的原理,网上有很多介绍,但是仅限于介绍原理。关于使用,很少有明确说明的。

这时候,最需要的是先猜。从它的原理和名字来看,应该是内核启动前获取的,那很可能是uboot传递进去的。跟uboot传递的其他参数,有格式上的区别吗?

试试再说。

于是,我在内核启动传递参数中,加上了上面的参数。(还是基于前面搭建的qemu环境)

qemu-system-arm -nographic -s -S  -m 512M -M virt -kernel /home/work/KernelStudy/Kernel/linux-4.19.244/arch/arm/boot/zImage -append "rdinit=/linuxrc root=/dev/ram console=ttyAMA0 loglevel=8  memblock=debug" -initrd /home/work/KernelStudy/rootfs/rootfs.img

qemu-system-arm -nographic -s -S  -m 512M -M virt -kernel /home/work/KernelStudy/Kernel/linux-4.19.244/arch/arm/boot/zImage -append "rdinit=/linuxrc root=/dev/ram console=ttyAMA0 loglevel=8  memblock=debug" -initrd /home/work/KernelStudy/rootfs/rootfs.img

如上,加上了memblock=debug

现在,我们再启动内核看看。

 可以看到,成功了,输出中增加了很多memblock的日志。现在,就可以代码结合日志,进一步的协助分析了。

内核其他模块也可以采用这种方式偷偷懒。这种内置的日志,是内核开发者们保留调试的,所以输出的都是比较关键的信息,可以节省我们的分析时间。现在就好好利用吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙赤子

你的小小鼓励助我翻山越岭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值