原生与野生
Linux 的驱动代码大致可分为两种:一种是已经进入 mainline 的,当内核 API 变化时,会被同步地修改;还有一种是 out-of-tree 的,需要用一套驱动代码去适配不同版本的内核。由于内核 API 持续变动的特性,进行内核适配就成了做驱动开发绕不过去的一个问题。
材料准备
「适配」简单说就是要编译出针对某个内核版本的 ".ko" 文件,这和普通的驱动编译没什么两样,原材料一个是内核头文件(在 make target 中由 "C" 参数指定路径),一个是驱动源码(由 "M" 参数指定路径)。
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
「内核头文件」是为编译 kernel modules 提供的一组头文件,在 RedHat/CentOS 系统中被命名为 "kernel-devel"【注-1】,因此亦可被称作「内核开发包」。
内核头文件怎么获取呢?
(1) 对于 Ubuntu 系统,以 18.04 (bionic) 版本为例,使用 "apt list linux-headers-unsigned-*-generic" 命令可列出该版本支持的标准内核(4.15, 4.18, 5.0, 5.3, 5.4)的头文件,对于这些标准内核,直接 "apt install" 安装即可。对于其他非标准内核(比如 5.2),可到这个网站下载对应的内核头文件。
(2) 对于 RedHat/CentOS 系统,