问题描述
我想尝试编写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内核。
最佳思路
有很多方法…
-
如果您要构建一个外部模块(包括正在开发的模块),则只需要内核头文件:
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软件包。
-
如果您要基于上游内核进行开发(这是我的建议),则应该克隆Linus’ tree并在那里工作。要测试您的模块,您需要构建一个完整的上游内核,或者使用上面第1点中给出的方法来构建您的模块。
无论如何,使用linux源软件包本身(使用apt-get source
获得)不是一个好主意,因为它实际上是为构建Ubuntu中使用的所有内核而设计的。如果您盲目地使用该源代码包debuild
,您将等待多个小时才能完成构建…(在某些情况下这是适当的,并且Ubuntu内核文档将解释该怎么做;但这很可能不是一个其中。)