之所以编译内核,是因为gem5全系统仿真需要vmlinux文件,在此记录一下以备后面需要。
此过程编译之后会获得vmlinux和bzImage两个文件;
主要参考知行大佬的编译内核与gem5官方教程
文章目录
- 一、Linux源码下载
- 二、安装编译依赖
- 三、编译
- 1. 内核编译前配置
- 2. 进行编译:
- 3. 编译失败进行清除重试
- 四、可能遇到的问题
- 错误1
- 错误2
- 错误3
一、Linux源码下载
注意:内核编译一般需要20GB左右的空间,可以预留相应的空间,之后的源码和编译过程都在那里进行。
Linux Kernel包含了所有Linux内核的版本,可以挑选自己需要的内核版本下载即可,本文以5.4.49为例,可以使用wget下载:
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页面手动下载并解压到指定位置。
二、安装编译依赖
一般来说,需要下面的依赖库,直接安装就可以:
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文件夹下面打开终端输入:
make menuconfig
在这个界面通过方向键和上边提示的字母选项进行配置,*代表已选择。具体配置可以参考编译内核或者按需选择其他教程。
配置完毕选择Save然后Exit退出,会生成一个.config文件,这个文件里面就包含了编译配置信息,所以,需要再修改配置信息,可以用vscode打开.config文件直接进行修改。
作为普通人的我们,不大清楚哪些需要哪些不需要,我选择使用gem5官方提供的.config文件,将这个文件下载下来替换原本.config内容即可。
注意,.config文件是隐藏文件,需要选择文件夹的显示隐藏文件才能看到。
2. 进行编译:
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. 编译失败进行清除重试
如果编译失败,使用下面命令清除重试:
sudo make mrproper
sudo make clean
四、可能遇到的问题
正常流程下来,极有可能遇到下面的问题:
错误1
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make: *** [Makefile:1868: certs] Error 2
在终端中执行:
scripts/config --disable SYSTEM_TRUSTED_KEYS
错误2
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
在终端中执行:
scripts/config --disable SYSTEM_REVOCATION_KEYS
错误3
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