是什么在推动人类社会不断的发展?说的好听一点,可能是不断增加的需求;不好听一点呢,就是不断膨胀的欲望。欲望中的很大一部分就是让人可以更懒。
动物把有效时间都拿来觅食了,所以,动物不需要专门去锻炼。人类在满足基础需求后,衍生了很多其他需求,这其中就包括了懒人需求。智能家居、自动驾驶、机器人等等,很多首先是让人可以更懒。可见,学会偷懒,是需要一点技术投入的。
不过,话说回来,学会偷懒,可以让我们提升自己。因为,转换一下思路,学会偷懒,就是创新了,就是找到更有效率的方法,避免低水平的重复!
好了,废话说多了。回归正题。
学内核的过程中,避免不了看代码,调代码。有时候,将执行过程的参数和流程打印出来,可以帮助我们更快速的了解执行逻辑,也可以辅助我们更深入的理解代码。
那么,问题来了,如何添加日志?其实,在我们考虑添加自己的日志前,可以先看看内核是否留有日志相关的代码,只是没有打开而已。如果能够利用内核自带的日志代码,可以比较有效和快速的辅助我们理解代码逻辑。
最近在看内存相关的代码时,就发现不少这样的代码。下面举个例子。
上面的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的日志。现在,就可以代码结合日志,进一步的协助分析了。
内核其他模块也可以采用这种方式偷偷懒。这种内置的日志,是内核开发者们保留调试的,所以输出的都是比较关键的信息,可以节省我们的分析时间。现在就好好利用吧!