ION内存泄漏导致稳定性排查
这是一次ion接口操作不规范引起内存泄漏,导致binder通信失败,最终定时器超时触发crash的稳定性问题排查
经过之前的汇编实践-解析命令行参数学习,发现在进行系统调用时,不管是调用syscall(), 还是libc封装的系统调用,最终都是通过int $0x80(32位 i386)或者syscall(x86_64)进入内核态从而调用对应的底层实现,x86_32是通过一个0x80的软中断实现的,而x86_64是通过汇编指令syscall实现。
疑问:
在代码编译前宏展开时,需要进行条件编译,这需要gcc指定参数,而指定什么参数由Makefile来控制.
trace.c在编译时gcc中的参数中会带有 -D__KERNEL__, -DMODULE, -D__KBUILD_MODNAME=kmod_trace, 可以参考linux-likely学习,这用在之后的宏展开。
Kbuild的学习主要从三部分学习的
关于Kbuild,可以参考Kbuild官方文档
关于Makefile构建linux的大体框架,见Makefile框架
在linux学习过程中,需要针对内核和动态模块进行调试,最常用的方法是gdb,但是linux gdb文档中描述的不够详细,在学习调试过程中碰到了不少坑并做如下记录。
在日常的工作和学习中,经常发现likely和unlikely的使用,在通知链节点注册时,有如下函数
1 | static int notifier_chain_register(struct notifier_block **nl, |
这里通过遍历节点和插入节点地址对比,防止程序运行时重复插入通知链节点。当然,重复插入这种情况下是非常少见的,因此编译器针对此进行了性能优化。