【Linux】编译Linux内核

之所以编译内核,是因为gem5全系统仿真需要vmlinux文件,在此记录一下以备后面需要。

此过程编译之后会获得vmlinux和bzImage两个文件;

主要参考知行大佬的编译内核gem5官方教程

文章目录

一、Linux源码下载

注意:内核编译一般需要20GB 左右的空间,可以预留相应的空间,之后的源码和编译过程都在那里进行。
Linux Kernel包含了所有Linux内核的版本,可以挑选自己需要的内核版本下载即可,本文以5.4.49为例,可以使用wget下载:

bash 复制代码
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.49.tar.gz
tar xf linux-5.4.49.tar.gz
cd linux-5.4.49

wget有可能比较慢,此时也可以直接点进上面的Linux Kernel页面手动下载并解压到指定位置。

二、安装编译依赖

一般来说,需要下面的依赖库,直接安装就可以:

bash 复制代码
sudo apt update
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison vim

三、编译

1. 内核编译前配置

编译内核前需要进行编译配置,选择哪些组件要编译进去,添加调试信息等。内核中包含了大量的驱动代码,很多驱动其实用不到,一般是通过一个图形化界面选择配置。

在linux-5.4.49文件夹下面打开终端输入:

bash 复制代码
make menuconfig

在这个界面通过方向键和上边提示的字母选项进行配置,*代表已选择。具体配置可以参考编译内核或者按需选择其他教程。

配置完毕选择Save然后Exit退出,会生成一个.config文件,这个文件里面就包含了编译配置信息,所以,需要再修改配置信息,可以用vscode打开.config文件直接进行修改。

作为普通人的我们,不大清楚哪些需要哪些不需要,我选择使用gem5官方提供的.config文件,将这个文件下载下来替换原本.config内容即可。

注意,.config文件是隐藏文件,需要选择文件夹的显示隐藏文件才能看到。

2. 进行编译:

bash 复制代码
sudo make -j 24
# 后面的数字是同时进行编译的线程数,可以灵活根据电脑配置选择

编译时间长短不定,取决于配置信息和线程数。使用gem5官方的配置文件我大概编译了几分钟就结束,得到的vmlinux文件只有26MB,但是自己通过图形化界面配置,编译则需要半个小时左右,得到的vmlinux文件有500MB。看来还是包含了很多不必要的东西。

编译得到的文件有:./vmlinux./arch/x86/boot/bzImage,参考知行大佬的解释:

vmlinux和bzImage都是Linux内核编译生成的可执行文件,它们的主要区别在于它们的文件格式和用途。

  • vmlinux是Linux内核编译生成的未压缩的内核镜像文件,它包含了整个内核的代码和数据,可以用来调试内核.它通常比较大,因为它没有被压缩.
  • bzImage是Linux内核编译生成的压缩内核镜像文件,它是用来引导启动Linux操作系统的.它是通过将vmlinux压缩成一个单独的文件,并添加一些引导代码和头部信息来生成的.

当系统引导时,bzImage首先会被加载到内存中,然后被解压缩成vmlinux形式的内核映像.因为vmlinux文件比较大,而且内核启动过程中需要加载和解压缩文件,所以bzImage文件通常比vmlinux文件小很多.

3. 编译失败进行清除重试

如果编译失败,使用下面命令清除重试:

bash 复制代码
sudo make mrproper
sudo make clean

四、可能遇到的问题

正常流程下来,极有可能遇到下面的问题:

错误1

bash 复制代码
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.
make: *** [Makefile:1868: certs] Error 2

在终端中执行:

bash 复制代码
scripts/config --disable SYSTEM_TRUSTED_KEYS

错误2

bash 复制代码
make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'.  Stop.
make: *** [Makefile:1868: certs] Error 2

在终端中执行:

bash 复制代码
scripts/config --disable SYSTEM_REVOCATION_KEYS

错误3

bash 复制代码
BTF: .tmp_vmlinux.btf: pahole version v1.15 is too old, need at least v1.16
Failed to generate BTF for vmlinux
Try to disable CONFIG_DEBUG_INFO_BTF
make: *** [Makefile:1199: vmlinux] Error 1

打开.config文件注释CONFIG_DEBUG_INFO_BTF

**注意:**建议遇到之后直接使用上面的清除命令,重新生成.config文件,提前将需要注释和取消的选项进行处理 。随后进行编译,会询问你是否需要开启上面注释的选项,全部按Enter默认就可以,不要选择Y或N。

报错参考1
报错参考2

相关推荐
qq 17780362224 分钟前
智能新时代,游戏盾守护顺畅体验
运维·服务器·网络·游戏·云计算·ddos·ip
Flying_Fish_roe1 小时前
linux-安全管理-防火墙与网络安全
linux·数据库·oracle
不见长安见晨雾1 小时前
Linux:vim编辑技巧
linux·编辑器·vim
神秘的土鸡2 小时前
Linux中使用Docker容器构建Tomcat容器完整教程
linux·运维·服务器·docker·容器·tomcat
shuxianshrng2 小时前
大气网格化精细化监管监测系统
大数据·服务器·windows·经验分享
friklogff2 小时前
【C#生态园】构建你的C#操作系统:框架选择与实践
服务器·开发语言·c#
TravisBytes2 小时前
linux 系统是如何收发数据包
linux·运维·服务器
平头哥在等你3 小时前
《计算机网络名词解释》
服务器·网络·计算机网络
德迅--文琪4 小时前
SCDN是服务器吗?SCDN防御服务器有什么特点?
运维·服务器
ice___Cpu4 小时前
Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
linux·运维·前端