我有一块运行 Layerscape 的 NXP Layerscape LS1012A 开发板 (FRWY),它本质上就是 Ubuntu 20.04。我已将 Murata 的 1XL 型 PCIe WiFi 模块(使用 NXP WiFi 芯片 88W9098)插入开发板上的 PCIe 插槽,并获取了创建驱动程序所需的所有二进制文件。
我在使用“make build”命令时遇到问题,从我读到的内容来看,这是因为我没有正确设置内核来进行构建(我使用的是内核 5.10.35)。有谁知道如何正确设置/构建/准备内核目录以便该驱动程序构建可以执行?
答案1
一般来说,构建内核模块(驱动程序)的第一个要求是拥有您正在为其构建驱动程序的确切内核版本的构建标头。根据发行版的不同,它们可能会打包为kernel-headers-<kernel version number>
(Fedora/RHEL 风格)或linux-headers-<kernel version number
(Debian/Ubuntu 风格)。某些发行版可能会省略单独的标头包,而只需要安装完整的内核源代码包来构建内核模块(我认为 SuSE 会这样做,或者至少习惯这样做)。
因此,对于类似 Ubuntu 的发行版,如果您还没有做过apt-get install linux-headers-$(uname -r)
,您应该这样做。您还应该apt-get install build-essential
确保您拥有编译器和所需的所有基本工具。
这里的一个陷阱是,如果您最近更新了系统但尚未重新启动:包管理器通常允许多个内核版本共存,但通常只保留最新版本的构建标头,除非明确告知要这样做。因此,包管理器可能已经安装了更新的内核,等待下次重新启动时激活,并且还更新了构建标头以匹配那内核......这将阻止你为你的模块构建模块当前的核心。
通常,如果您使用打包的内核,并且已经安装了包含您的内核版本的标头的适当包,则应该有一个符号链接/lib/modules/$(uname -r)/build
,指向标头所在的目录。通常是第三方模块/驱动程序构建进程可以使用它来自动查找当前内核的构建标头。
如果您正在构建自己的自定义内核,则可以自己创建这样的符号链接:只需将其指向用于构建内核的 Linux 源代码树的根目录即可。例如:
ln -s /usr/local/src/linux-5.10.35 /lib/modules/5.10.35/build