- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: [email protected]
- QQ交流群: 544216206, 点击查看群介绍
点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)。
下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。
点击这里从百度网盘下载对应平台的虚拟机镜像,x86_64
(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.zip
,arm64
(2020年末之后的苹果电脑)选择ubuntu-aarch64.zip
。虚拟机运行后,登录界面的密码是1
。
获取代码
用git下载内核代码,仓库链接可以点击内核网站上对应版本的[browse] -> summary
查看,我们下载mainline版本的代码:
git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git # 国内使用googlesource仓库链接比较快
也可以在/pub/linux/kernel/下载某个版本代码的压缩包。
编译步骤
建议新建一个build
目录,把所有的编译输出存放在这个目录下,注意.config
文件复制到build/.config
。.config
配置文件至少要打开以下配置(建议通过make O=build menuconfig
命令修改):
CONFIG_EXT4_FS
CONFIG_XFS_FS
CONFIG_VIRTIO_BLK
CONFIG_VIRTIO_NET
CONFIG_SCSI_VIRTIO
CONFIG_BLK_DEV_SD
CONFIG_BLK_DEV_NVME
CONFIG_BINFMT_MISC
rm build -rf && mkdir build
cp /home/sonvhi/chenxiaosong/code/tmp/configs/x86_64-config build/.config
编译和安装命令如下:
make O=build menuconfig # 交互式地配置内核的编译选项
make O=build olddefconfig -j`nproc`
make O=build bzImage -j`nproc` # x86_64
make O=build Image -j`nproc` # aarch64,比如2020年末之后的arm芯片的苹果电脑上vmware fusion安装的ubuntu
make O=build modules -j`nproc`
mkdir -p build/boot && make O=build install INSTALL_PATH=boot -j`nproc`
make O=build modules_install INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=mod -j`nproc`
在x86_64
下,如果是交叉编译其他架构,ARCH
的值为arch/
目录下相应的架构,编译命令是:
make ARCH=i386 O=build bzImage # x86 32bit
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- O=build zImage # armel, arm eabi(embeded abi) little endian, 传参数用普通寄存器
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build zImage # armhf, arm eabi(embeded abi) little endian hard float, 传参数用fpu的寄存器,浮点运算性能更高
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=build Image
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- O=build Image
一些额外的补丁
如果你要更方便的使用一些调试的功能,就要加一些额外的补丁。
-
降低编译优化等级,默认的内核编译优化等级太高,用GDB调试时不太方便,有些函数语句被优化了,无法打断点,这时就要降低编译优化等级。做好的虚拟机中已经打上了降低编译优化等级的补丁。比如
x86_64
架构下可以在x86_64
目录下选择对应版本的补丁,更多详细的内容请查看GDB调试相关的章节。 -
dump_stack()
输出的栈全是问号的解决办法。如果你使用dump_stack()
输出的栈全是问号,可以 revert 补丁f1d9a2abff66 x86/unwind/orc: Don't skip the first frame for inactive tasks
。主线已经有补丁做了 revert:230db82413c0 x86/unwind/orc: Fix unreliable stack dump with gcov
。 -
肯定还有一些其他有用的补丁,后面再补充哈。
发行版替换内核
用发行版/boot/config-`uname -r`
配置文件,删除CONFIG_SYSTEM_TRUSTED_KEYS
和CONFIG_SYSTEM_REVOCATION_KEYS
配置值,在编译环境上编译安装后,删除build/mod/lib/modules/xxx/build
和build/mod/lib/modules/xxx/source
链接文件,然后压缩(文件太多,不压缩复制会很慢)打包复制到待测环境上。
把build/mod/lib/modules/xxx/
复制到待测环境上的/lib/modules/
路径,把build/boot/
目录下的文件复制到待测环境上的/boot/
路径下。
生成initrd.img
,其中xxx
为内核版本:
# centos
mkinitrd /boot/initrd.img-xxx xxx
# ubuntu
mkinitramfs -o /boot/initrd.img-xxx xxx
ubuntu下运行update-grub
,x86
的grub.cfg
文件在/boot/grub/grub.cfg
,arm64
的grub.cfg
文件在/boot/efi/boot/grub/grub.cfg
。麒麟桌面系统要在把grub.cfg
新生成的启动项里的security=kysec
改成security=
(注意后面有空格)。