Linux 内核编译打包
1. 准备环境
安装交叉编译工具链
在Ubuntu/Debian系统中安装ARM64交叉编译器:
bash
sudo apt update
sudo apt install gcc-aarch64-linux-gnu
验证工具链
bash
aarch64-linux-gnu-gcc --version
# 应输出类似:aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
2. 获取Linux内核源码
下载源码
从官方仓库克隆或下载稳定版内核(以6.6版本为例):
bash
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
git checkout v6.6
3. 配置内核
选择默认配置
bash
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
自定义配置(可选)
如需调整内核选项(如启用特定驱动):
bash
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
4. 编译内核
执行编译
bash
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
生成文件
- 内核镜像:
arch/arm64/boot/Image
- 设备树文件(DTB):位于
arch/arm64/boot/dts/
目录下(如rockchip/rk3568-evb.dtb
)。
5. 打包镜像
方案一:直接使用Image文件
直接使用编译生成的 Image
文件,适用于UEFI引导或已配置的引导加载程序(如U-Boot)。
方案二:生成U-Boot兼容的uImage
安装 u-boot-tools
:
bash
sudo apt install u-boot-tools
使用 mkimage
转换镜像(以加载地址 0x80080000
为例):
bash
mkimage -A arm64 -O linux -T kernel -C none -a 0x80080000 -e 0x80080000 -n "Linux Kernel" -d arch/arm64/boot/Image uImage
6. 测试镜像
通过QEMU模拟器测试
安装QEMU:
bash
sudo apt install qemu-system-arm
启动模拟器(使用内核和设备树):
bash
qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-smp 4 \
-m 4G \
-kernel arch/arm64/boot/Image \
-append "console=ttyAMA0 root=/dev/vda" \
-drive format=raw,file=ubuntu-rootfs.img \
-nographic
在真实设备上测试
将 Image
或 uImage
和对应的 .dtb
文件复制到设备的启动分区(如SD卡的 /boot
目录),并配置引导加载程序(如U-Boot)。
常见问题解决
-
编译失败:
- 检查依赖库是否安装完整:
sudo apt install build-essential libncurses-dev libssl-dev bc flex bison
. - 确保使用正确的
ARCH
和CROSS_COMPILE
参数。
- 检查依赖库是否安装完整:
-
设备树文件缺失:
- 在内核配置中启用对应平台的设备树支持(如
CONFIG_ARCH_ROCKCHIP=y
)。
- 在内核配置中启用对应平台的设备树支持(如
-
启动时卡住:
- 在内核命令行添加
earlycon
调试参数:console=ttyAMA0 earlycon=pl011,0x9000000
.
- 在内核命令行添加
完整命令示例
bash
# 1. 克隆内核源码
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
git checkout v6.6
# 2. 配置并编译
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
# 3. 生成uImage(可选)
sudo apt install u-boot-tools
mkimage -A arm64 -O linux -T kernel -C none -a 0x80080000 -e 0x80080000 -n "Linux" -d arch/arm64/boot/Image uImage
# 4. 测试
qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -smp 1 -m 512 -kernel arch/arm64/boot/Image -append "console=ttyAMA0"
通过以上步骤,即可完成ARMv8架构的Linux内核编译与镜像打包。实际使用时,需根据目标硬件调整设备树和引导参数。