Linux内核开发环境-代码编译

建议点击这里查看个人主页上的最新原文

点击这里在哔哩哔哩bilibili在线观看配套的教学视频

点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)

点击跳转到内核课程所有目录

下面介绍Linux内核编译环境和测试环境的搭建过程,当然我也为各位朋友准备好了已经安装好的虚拟机镜像,只需下载运行即可。

点击这里从百度网盘下载对应平台的虚拟机镜像x86_64(也就是你平时用来安装windows系统的电脑,或者2020年前的苹果电脑)选择ubuntu-x64_64.ziparm64(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_KEYSCONFIG_SYSTEM_REVOCATION_KEYS配置值,在编译环境上编译安装后,删除build/mod/lib/modules/xxx/buildbuild/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-grubx86grub.cfg文件在/boot/grub/grub.cfgarm64grub.cfg文件在/boot/efi/boot/grub/grub.cfg。麒麟桌面系统要在把grub.cfg新生成的启动项里的security=kysec改成security= (注意后面有空格)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值