[hardware development] [小米平板5] 如何优雅地编译Linux内核并做成boot.img与dtbo文件
Tofloor
poster avatar
mozixun
Moderator
2025-07-19 13:51
Author

这是一个分支教程,主教程在: https://bbs.deepin.org.cn/post/289593?id=289593

首先,你需要安装以下包:

sudo apt install libncurses-dev device-tree-compiler gawk git git-lfs flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm gcc-aarch64-linux-gnu

一.制作boot.img

1.下载SM8150-Mainline的主线代码 (截至目前最新内核版本是6.15.0,但为了稳定起见我用的6.14.11)

git clone -b sm8150/6.14.11 https://gitlab.com/sm8150-mainline/linux.git

2.编译内核源码: (建议make后面加-j参数限制线程数)

rm -rf install
cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig sm8150.config
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image.gz dtbs
make ARCH=arm64 install INSTALL_PATH=../install/boot
make ARCH=arm64 dtbs_install INSTALL_DTBS_PATH=../install/boot/dtbs

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules
rm -rf ../install/lib/modules/
make ARCH=arm64 modules_install INSTALL_MOD_PATH=../install

3.把zImage搞出来: cat ./arch/arm64/boot/Image.gz ./arch/arm64/boot/dts/qcom/sm8150-xiaomi-nabu.dtb > zImage

然后生成的zImage就在Linux内核编译的根目录那,类似于:

image.png

4.下载特供版mkbootimg工具: https://wwyg.lanzouo.com/iEjMy31crtha

解压后把zImage拷贝到mkbootimg同个文件夹下,类似于这样: (警告:mkbootimg不要用i686的,必须用x86_64,我个人没测试过i686的是否正常

image.png

5.制作boot.img镜像:

./mkbootimg --kernel zImage --cmdline "pd_ignore_unused clk_ignore_unused androidboot.verifiedbootstate=green androidboot.force_normal_boot=1 console=tty0 root=/dev/sda31 rw rootwait text" --base 0x00000000 --kernel_offset 0x00008000 --tags_offset 0x00000100 --pagesize 4096 --id -o boot.img

附加1:如果您需要开启AppArmor防护(给Debian/SUSE系用):

./mkbootimg --kernel zImage --cmdline "pd_ignore_unused clk_ignore_unused androidboot.verifiedbootstate=green androidboot.force_normal_boot=1 ​apparmor=1 security=apparmor​ console=tty0 root=/dev/sda31 rw rootwait text" --base 0x00000000 --kernel_offset 0x00008000 --tags_offset 0x00000100 --pagesize 4096 --id -o boot.img

附加2:如果你需要一个可以启动自动修复文件系统的,可以制作一个boot-fsck.img,平板连电脑用fastboot boot boot-fsck.img就可以强制触发文件系统修复:

./mkbootimg --kernel zImage --cmdline "pd_ignore_unused clk_ignore_unused androidboot.verifiedbootstate=green androidboot.force_normal_boot=1 fsck.mode=force fsck.repair=yes console=tty0 root=/dev/sda31 ro rootwait text" --base 0x00000000 --kernel_offset 0x00008000 --tags_offset 0x00000100 --pagesize 4096 --id -o boot-fsck.img

这里注意两点: 1./dev/sda31实际是你的实际准备装Linux的分区挂载点 2.如果你需要后续可以手动指定重启检查文件系统,防止数据丢失,务必把rw改成ro

然后你的boot.img就做好了~

二.制作dtbo设备树集成文件

(防止抽风的小米bootloader重启了几次因为没有dtbo分区而直接给你卡bootloader,刷入dtbo能不能解决我还在测试)

1.回到内核源码的根目录,先用cpp命令预编译出dts设备树,放在内核源码根目录叫做nabu.dts:

cpp -nostdinc -I./include  -undef -x assembler-with-cpp -o nabu.dts ./arch/arm64/boot/dts/qcom/sm8150-xiaomi-nabu.dts

文件位置在这:

image.png

2.把这个预编译的nabu.dts用dtc命令编译成dtbo文件:

dtc -@ -O dtb -o xiaomi-nabu.dtbo -I dts ./nabu.dts

执行后你会在内核源码根目录看到xiaomi-nabu.dtbo如下图:

image.png

然后在这里右键打开终端,把你的小米平板5重启到bootloader(fastboot)模式,然后输入以下指令进行刷入即可:

fastboot flash dtbo_ab xiaomi-nabu.dtbo

题外话:这边建议还是备份一下dtbo和boot.img等这些分区文件,这样出了问题可以快速救回

Reply Favorite View the author
All Replies

No replies yet