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

目录

  • 前言
  • 检查是否已有构建好的内核树
  • 下载内核源码
  • 开始构建
    • 1. 安装必须的包
    • 2. 生成配置文件
    • 3. 开始make
  • 附录:可能的错误
    • 错误一:No rule to make target
    • 错误二
    • 错误三
  • 参考链接

前言

想要编写自己的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

【超详细】Linux内核树的构建相关推荐

  1. 超详细Linux 安装Mysql

    超详细 Linux 安装Mysql 1.下载方式 1.1 Linux 内部下载(不推荐,比较慢) 1.2 本地下载,上传到linux 2.解压 3.创建MYSQL⽤户和⽤户组 4.配置my.cnf 5 ...

  2. Linux 内核树编译

    前言 其实我现在还不懂内核树是个什么东西? 为什么写驱动要编译内核树,不是只用头文件就好了吗? 反正昨天是搭建好了驱动开发环境(仅仅是安装了对应的操作系统和一些工具),现在记录一下编译内核的过程. 编 ...

  3. linux内核编译最详细,Linux内核编译详细教程,linux内核编译

    Linux内核编译详细教程,linux内核编译 尝试编译下Linux-kernel 4.14.14,使用Ubuntu 16.04 64位 系统. kernel-4.14.14 内核文件约96MB,解压 ...

  4. linux内核使用scons构建,scons安装和使用

    scons安装和使用 1. scons是神马? scons是linux下的自动构建工具,类似cmake. 2. 安装 wget http://prdownloads.sourceforge.net/s ...

  5. linux系统发育树的构建步骤,手把手教你用 Fast Tree 快速构建序列进化树

    常见的建树方法有:贝叶斯法(Bayesian),最大似然法(Maximum likelihood,ML),最大简约法(Maximum parsimony,MP),邻接法(Neighbor-Joinin ...

  6. linux内核使用scons构建,如何使用scons进行交叉构建

    我正在尝试创建最简单的可想象的SConstruct文件,用于交叉编译程序. 我尝试了不同的设置,最新的SConstruct文件在这里: env_options = { "CC" : ...

  7. linux教程超详细,linux搭建node超详细教程

    linux 环境搭建详细步骤 1.访问官方网址:https://nodejs.org/en/download/ 2.选择和你服务器版本相关的压缩包,复制下载链接 3.服务器登录ssh,(这里我用的服务 ...

  8. linux系统发育树的构建步骤,megacc构建进化树.mao文件生成方法

    基于linux版megacc构建系统进化树命令如下: /biosoft/MEGA/megacc -a .mao -d fasta -o ./ -a输入的是构建进化树的参数 .mao文件 -d输入的是多 ...

  9. linux系统发育树的构建步骤,分子进化树构建的简要步骤(以蛋白为例)

    PhyML利用氨基酸序列建树步骤 (核酸建树也可以作为参考) 前言:本文阅读对象适合建树新手,生物信息学高手请勿嘲笑,其中有什么错误还恳请指点.为什么要建树及其你要解决什么问题这里不做讨论,只是一个纯 ...

最新文章

  1. arduino下载库出错_【arduino】DIY音乐播放器,arduino播放wav音乐,TRMpcm库测试及使用...
  2. JavaScript学习杂记--对象和数组
  3. 【数据库的备份与还原】 .
  4. 微软私有云解决方案_微软发布电信云平台 ,互联网巨头争夺5G网络商机
  5. dao层和service层和control_最受欢迎Java数据库访问框架(DAO层)
  6. vue学习日志-过滤器
  7. QQ文件上传不了:什么年代了,还使用简单的关键词过滤,智能一点可好
  8. 企业微信API群机器人配置
  9. 如何解决切换双系统导致windows没声音的问题
  10. 【实操】下载在线m3u8视频为本地mp4
  11. windows 打印机管理机制(任务后台等待机制)
  12. 相当全的JS及.NET正则表达式语法
  13. BIOS硬盘模式更改为AHCI模式,及更改后win10蓝屏的解决办法
  14. 泛型在Android中的应用
  15. Vert.x(vertx) 实现TCP服务
  16. 六、cocos2dx-效果(Effect)
  17. 鸿蒙掉不掉凤羽符,装备各部件灌注符的获取方式(和肝燕面基成功,给萌新的福利)...
  18. constraint PK_LDBACKUPTEXTINFO primary key (xx) using index tablespace lisi
  19. ACM2019春季训练- How Many Tables HDU - 1213(初识并查集+转倚天屠龙记故事)
  20. B1019(数字黑洞)

热门文章

  1. 跟驰理论 matlab,[经济学]第5章 跟驰理论.ppt
  2. 企业APP联盟,抢占企业移动互联网时代营销制高点
  3. 微信抢红包的方案_微信抢红包方法图文详解
  4. Vue点击选中(多选)选中右上角有三角形
  5. 摩拜单车拉勾网php,Python拉勾网数据采集与可视化
  6. doom主程序员相关文章
  7. Android Studio项目打包:3、Android Studio生成的apk究竟在哪里?(非正式打包)
  8. java 代码生成nc 格式的文件,并且读取出nc格式里面的数据(已提供代码)
  9. 升级后清理Ubuntu Grub引导菜单
  10. 转载—左耳朵耗子《程序员如何把控自己的职业》