我们的产品包含多个内核驱动模块,随着Linux内核的不断演进,既有的驱动代码可能因为使用了一些被新版本内核所废弃的函数或者数据结构,导致不能编译通过,或者运行时出错。这时,我们就需要修改我们的驱动代码,以便其能在新版本的内核上正常工作,这个过程通常被称为「适配」。
最近就接到了一个客户在CentOS 7上适配5.7.x内核的需求,在此之前,我们适配过的最高内核版本是5.4.x。经过与Makefile的一番较劲,编译总算通过了,可是一运行新编译的驱动,系统立刻卡住,失去响应。
本来想着要是有coredump文件的话,可以好好分析下,后来才意识到,像这种非CentOS标准标本的内核(比如CentOS 7.8对应的标准内核是3.10.0-1127),网上是没有对应的debuginfo可供下载的,就算产生了coredump也是白搭。不过好在还是有一段弥足珍贵的call trace:
从"Comm"后面跟的名字看,确实是我们产品中操作这个驱动的应用层进程的名称。这里显然是在做一个"open"操作,没有debuginfo,不知道具体打开的是哪个文件,不过从"proc_reg_open"来看,应该是在访问"/proc"目录下的某个文件。
我们的驱动会在procfs文件系统中注册一些参数,以便于观察该驱动的状态,以及动态地调整一部分配置。为了确定是由访问这些参数引起的异常,尝试手动加载