本文档因为过于繁琐,现已弃用。最新教程请见【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-dev
,flex
,bison
,libelf-dev
,libssl-dev
sudo apt-get install ncurses-dev flex bison libelf-dev libssl-dev dwarves
(注意:这里列出的是Ubuntu系统中包的名字。在其它系统中,这些包可能有不同的名字,请各位自行检索。)
2. 生成配置文件
正式构建前,需要先生成配置文件,来指定构建出的系统的各项属性。
这里使用menuconfig
。
make menuconfig
(还有很多其他的生成配置文件的方法,如oldconfig
,menuconfig
,xconfig
。每种需要另外安装的包可能有所不同。)
如果出现任何报错,安装对应的包即可。
如果没有任何问题,将显示下面的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.
解决方法
-
打开
.config
文件vim .config
-
把
CONFIG_SYSTEM_TRUSTED_KEYS
的值改为空字符串""
。(感谢@王小多在这篇文章下的评论:如果文件中这一行被注释了:
# CONFIG_SYSTEM_TRUSTED_KEYS not set
,也需要解除注释,手动设为空字符串才行。否则sysnconfig
仍会问你要不要设置。)CONFIG_SYSTEM_TRUSTED_KEYS=""
-
设置的结果如下
(有的小伙伴问我这里的vim是怎么设置的,具体的配置我放在了这篇文章里【vim】个性化配置vim(.vimrc)) -
然后重新运行
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
参考链接
Compiling the kernel 5.11.11 - askubuntu
https://blog.csdn.net/liuer2004_82/article/details/50650943
https://os.51cto.com/art/202105/663841.htm