本文档因为过于繁琐,现已弃用。最新教程请见【Linux内核树】五步构建


前言

想要编写自己的Linux驱动(driver),第一步是要先构建Linux内核进程树

检查是否已有构建好的内核树

Ubuntu默认是不配备 建议先确认电脑上是否已经有构建好的内核树(别在花费了几个小时之后才发现…)。内核树通常所在的具体目录为/lib/modules/<系统版本>

可以使用uname查询系统版本:

uname -r

在这里插入图片描述
那么如果我的电脑上已经有构建好的内核树的话,所在目录就应该是/lib/modules/5.11.0-40-generic

目录下的具体样子大概是下图这样
在这里插入图片描述


下载内核源码

1. 内核版本的选择
如何选择将要构建的内核进程树的版本,要看编写的驱动想要运行在哪个版本的Linux内核上。

比如,我想编写一个能运行在我的内核上的驱动(driver),首先要做的是查看自己的内核版本。

方法是运行uname命令

uname -r

在这里插入图片描述
这里显示的5.11.0-40-generic可能有点让人感到模糊不清。

更精确的方法是去查看/usr/src/<uname -r显示的版本>/Makefile文件里开头的版本号。比如我这里是
在这里插入图片描述
所对应的版本就是5.11.22

如果/usr/src里有多个文件,随意打开一个就行,其中的Makefile开头的版本号一般情况下是一致的。
在这里插入图片描述


2. 下载源码
在这里的官网下载源文件,将解压的文件移到/usr/src/目录下,这是后续操作的所在目录。
https://mirrors.edge.kernel.org/pub/linux/kernel/

(注意,要下载linux开头的,而不是ChangeLog开头的)

其他方法

运行下面的命令自动下载

sudo apt-get install dpkg-dev<pre name="code" class="cpp">$ apt-get source linux-image-$(uname -r)

开始构建

1. 安装必须的包

首先,确保已经安装这些包(这是为了下一步的menuconfig所准备的,如果使用不同的config方法,需要的包可能有所不同;dwarves是为了make bzImage准备的)。
ncurses-devflexbisonlibelf-devlibssl-dev

sudo apt-get install ncurses-dev flex bison libelf-dev libssl-dev dwarves

(注意:这里列出的是Ubuntu系统中包的名字。在其它系统中,这些包可能有不同的名字,请各位自行检索。)

2. 生成配置文件

正式构建前,需要先生成配置文件,来指定构建出的系统的各项属性。

这里使用menuconfig

make menuconfig

(还有很多其他的生成配置文件的方法,如oldconfigmenuconfigxconfig。每种需要另外安装的包可能有所不同。)

如果出现任何报错,安装对应的包即可。

如果没有任何问题,将显示下面的UI
在这里插入图片描述
不用做改变,按两下Esc退出即可。(如果弹出提示框选择Yes即可。)

(如果想了解每种选项的作用,可以参照这篇文章:Make Menuconfig详解 (配置内核选择)- CSDN

3. 开始make

!!!注意:开始make前请先查看附录:错误二,保证系统内存等资源足够,防止花费了很长的时间结果因为内存不够而出错,导致从头重来。

运行make 命令(-j命令可开启并发)

(并发能够提速不少。并发数通常最多可以是CPU数量的两倍。在-j后面添加数字可以指定并发的数量上限,不指定的话默认是无上限,但是亲测容易死机…)

make -j 12

等待构建完成(不开启并发的情况下过程可能持续1到多小时,因此建议使用-j命令并发提速)。
在这里插入图片描述

编译完成后再ls会有一点不同。

(编译前)请添加图片描述
(编译后)请添加图片描述

然后运行

make bzImage

如果出错提示说

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.

运行这行命令就行。(具体见附录:错误一

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

成功后会显示如下信息
请添加图片描述
之后再运行

make modules 

结束时呈现如下结果
在这里插入图片描述

最后运行

make modules_install 

结束时情况如下图
在这里插入图片描述

成功后,在系统根目录下的/lib/modules里,会出现一个新的目录/lib/modules/5.11.0-41-generic/

之后要编译模块文件时,就需要进入/lib/modules/5.11.0-41-generic/目录下的build目录中。(然后我就发现自己电脑上本来已经有一个generic文件夹了。。。)

至此,就大功告成了。重启系统即可。


附录:可能的错误

错误一:No rule to make target

报错信息:
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.

解决方法

  1. 打开.config文件

    vim .config
    
  2. CONFIG_SYSTEM_TRUSTED_KEYS的值改为空字符串""

    (感谢@王小多这篇文章下的评论:如果文件中这一行被注释了:# CONFIG_SYSTEM_TRUSTED_KEYS not set,也需要解除注释,手动设为空字符串才行。否则sysnconfig仍会问你要不要设置。)

    CONFIG_SYSTEM_TRUSTED_KEYS=""
    
  3. 设置的结果如下
    在这里插入图片描述
    (有的小伙伴问我这里的vim是怎么设置的,具体的配置我放在了这篇文章里【vim】个性化配置vim(.vimrc))

  4. 然后重新运行make命令即可。

解决方法二

也可在终端中运行下面的命令来达到相同的效果。

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

错误二

错误信息
内存不够

解决方法
解除一些资源使用限制。
使用ulimit命令可以查看当前的资源使用限制。

ulimit -a

通过运行下面的命令来解除限制

# -s 对应 stack size, -m 对应 max memory size, ..(更多内容在图里倒数第二列中查找)
ulimit -s unlimited -m unlimited -v unlimited

解除后的结果
在这里插入图片描述
仍然不行的话可以尝试扩展内存大小。

错误三

报错信息:
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

解决方法

下载dwarves

sudo apt install dwarves

参考链接

Linux内核剖析

内核错误: No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘ - CSDN

Compiling the kernel 5.11.11 - askubuntu

linux 内核源码树的建立

linux内核树的建立

https://blog.csdn.net/liuer2004_82/article/details/50650943

https://os.51cto.com/art/202105/663841.htm

https://blog.csdn.net/u010629326/article/details/73196311

Linux模块详解 - iteye

BuildYourOwnKernel - Ubuntu

Logo

更多推荐