我想尝试编写一个Linux 驱动程序。我正在尝试设置我的环境。我当前的内核:
$ uname -r
4.10.0-37-generic
然后我下载源代码:
$ apt-get source linux-image-$(uname -r)
Reading package lists... Done
Picking 'linux' as source package instead of 'linux-image-4.10.0-37-generic'
...
我去编译并修改我的驱动程序,但失败了。查看dmesg,显示:
version magic '4.10.17 SMP mod_unload ' should be '4.10.0-37-generic SMP mod_unload '
此时,我很困惑。我返回到我下载的源代码树,当我运行时
$ make kernelversion
4.10.17
好的,尝试两个。下载内核 4.10.17 并安装。
$ uname -r
4.10.17-041017-generic
仍然错误:
version magic '4.10.17 SMP mod_unload ' should be '4.10.17-041017-generic SMP mod_unload
所以也许有人可以提供帮助:对我来说,在 ubuntu 上获得工作内核和匹配源的最佳和正确方法是什么(好吧,xubuntu,但我认为这并不重要)?我是否需要从 kernel.org 获取代码并从头开始构建它?我有点想匹配已发布的 Ubuntu 内核。
答案1
有多种方法...
如果您尝试构建外部模块(包括您正在开发的模块),则只需要内核头文件:
apt install linux-header-$(uname -r)
这将提供必要的文件,以便符号
/lib/modules/$(uname -r)/{build,source}
链接指向有意义的内容。然后你可以通过运行在另一个目录中构建一个模块make -C /lib/modules/$(uname -r)/build SUBDIRS="/path/to/your/module" modules
这将确保该模块是为您正在运行的内核构建的。
如果您想基于 Ubuntu 内核进行开发,请使用适当的
linux-source
软件包;对于您的 Ubuntu 版本,目前是linux-source-4.10.0
:apt install linux-source-4.10.0 cd /usr/src tar xf linux-source-4.10.0.tar.bz2
这将包括 Ubuntu 内核补丁,允许您构建与当前内核具有相同功能的内核。但请注意包描述中的警告:
该包主要供其他包使用,以构建自定义风味。
如果您希望使用此软件包来创建自定义 Linux 内核,那么建议您研究一下 kernel-package 软件包,该软件包旨在简化创建内核映像包的任务。
如果您只是尝试为您的内核构建第三方模块,则不需要此软件包。安装适当的 linux-headers 包。
如果你想基于上游内核进行开发(这是我推荐的),你应该克隆莱纳斯的树并在那里工作。要测试您的模块,您需要构建完整的上游内核,或者使用上面第 1 点中给出的方法构建模块。
无论如何,使用Linux的源包本身(使用 获得apt-get source
),因为它实际上是为构建 Ubuntu 中使用的所有内核而设计的。如果你盲目地debuild
使用该源码包,你将等待几个小时才能完成构建......(在某些情况下,这是适当的,Ubuntu 内核文档会解释该怎么做;但这很可能不是其中之一。)