获取内核源代码(ubuntu)

Wil*_* Am 7 ubuntu kernel kernel-modules linux-kernel

我想尝试编写一个 linux 驱动程序。我正在尝试设置我的环境。我当前的内核:

$ uname -r
4.10.0-37-generic
Run Code Online (Sandbox Code Playgroud)

然后我下载源代码:

$ 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'
...
Run Code Online (Sandbox Code Playgroud)

我去编译和修改我的驱动程序,它失败了。查看 dmesg,它显示:

version magic '4.10.17 SMP mod_unload ' should be '4.10.0-37-generic SMP mod_unload '
Run Code Online (Sandbox Code Playgroud)

在这一点上,我很困惑。我回到我下载的源代码树,当我运行时

$ make kernelversion
4.10.17
Run Code Online (Sandbox Code Playgroud)

好的,试试两个。下载内核 4.10.17 并安装它。

$ uname -r
4.10.17-041017-generic
Run Code Online (Sandbox Code Playgroud)

还是报错:

version magic '4.10.17 SMP mod_unload ' should be '4.10.17-041017-generic SMP mod_unload
Run Code Online (Sandbox Code Playgroud)

所以也许有人可以提供帮助:对我来说,在 ubuntu 上获得工作内核和匹配源的最佳和正确方法是什么(嗯,xubuntu,但我认为这不重要)?我是否需要从 kernel.org 获取代码并从头开始构建它?我有点想匹配随附的 Ubuntu 内核。

Ste*_*itt 7

有很多方法...

  1. 如果您尝试构建外部模块(包括您正在开发的模块),则只需要内核头文件:

    apt install linux-header-$(uname -r)
    
    Run Code Online (Sandbox Code Playgroud)

    这将提供必要的文件,以便/lib/modules/$(uname -r)/{build,source}符号链接指向有意义的内容。然后你可以通过运行在另一个目录中构建一个模块

    make -C /lib/modules/$(uname -r)/build SUBDIRS="/path/to/your/module" modules
    
    Run Code Online (Sandbox Code Playgroud)

    这将确保模块是为您正在运行的内核构建的。

  2. 如果您想基于 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
    
    Run Code Online (Sandbox Code Playgroud)

    这将包括 Ubuntu 内核补丁,允许您构建与当前内核具有相同功能的内核。但是请注意包描述中的警告:

    这个包主要供其他包使用,以构建自定义风格。

    如果您希望使用此包来创建自定义 Linux 内核,那么建议您研究内核包,该包旨在简化创建内核映像包的任务。

    如果你只是想为你的内核构建第三方模块,你不需要这个包。而是安装适当的 linux-headers 包。

  3. 如果您想基于上游内核进行开发(这是我推荐的),您应该克隆Linus 的树并在那里工作。要测试您的模块,您需要构建一个完整的上游内核,或者使用上面第 1 点中给出的方法构建您的模块。

在任何情况下,使用linux源包本身(使用 获得apt-get source)都不是一个好主意,因为它确实是为构建 Ubuntu 中使用的所有内核而设计的。如果你盲目地debuild使用那个源包,你会在构建完成前等待好几个小时......(在某些情况下这合适的,Ubuntu 内核文档将解释要做什么;但这很可能不是其中之一他们。)