- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- 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= (注意后面有空格)。
1572

被折叠的 条评论
为什么被折叠?



