我想从头开始为arm64(aarch64)平台编译一个Linux内核,用于启动Raspberry Pi 4。
主机是 amd64 并运行 Debian 变体 (Ubuntu 20.04.1 LTS)
我创建了以下脚本,尝试执行所有操作:
###### 构建环境 ###### # 下载并安装主机系统所需的软件包来进行编译 apt install build-essential libgmp-dev libmpfr-dev libmpc-dev libisl-dev libncurses5-dev bc git-core bison flex # 在 RAM 中创建临时构建环境 前缀=/tmp/BE mkdir -p ${前缀} umount ${PREFIX} 2>&1 > /dev/null 挂载 -t tmpfs tmpfs ${PREFIX} # 二进制实用程序: # 从 ftp.gnu.org 下载 binutils 并编译并将其安装到主机 [redacted] cd obj-binutils ../binutils-${BINUTILSVERSION}/configure --prefix=${PREFIX}/binutils --target=aarch64-linux-gnu --disable-nls 进行安装 # 海湾合作委员会: # 从 ftp.gnu.org 下载 gcc 并编译并安装到主机上 [已编辑] # 配置海湾合作委员会: ../gcc-${GCCVERSION}/configure --prefix=${PREFIX}/gcc --target=aarch64-linux-gnu \ --with-newlib --without-headers --disable-nls --disable-shared --disable-threads \ --disable-libssp --disable-decimal-float --disable-libquadmath --disable-libvtv \ --disable-libgomp --disable-libatomic --enable-languages=c # 安装海湾合作委员会: make all-gcc -j${线程} 进行安装-gcc # 测试: ${PREFIX}/gcc/bin/aarch64-linux-gnu-gcc -v # libgcc 可选 [已跳过] ###### Linux ###### # 请注意,我们从 raspberrypi linux git 下载 LINUXBRANCH="rpi-5.10.y" mkdir -p ${PREFIX}/linux cd ${PREFIX}/linux git克隆--深度= 1 -b $ {LINUXBRANCH} https://github.com/raspberrypi/linux.git mkdir 内核输出 # 将编译好的 gcc/binutils 二进制文件复制到 linux /bin 目录 光盘Linux 目录目录 mv ${PREFIX}/binutils/bin/* ${PREFIX}/linux/linux/bin/ mv ${PREFIX}/gcc/bin/* ${PREFIX}/linux/linux/bin/ # RPi4具体配置 内核=内核8 使 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu- bcm2711_defconfig # Linux 菜单配置 使 O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=${PREFIX}/linux/linux/bin/aarch64-linux-gnu- menuconfig # Linux 构建 make -j${THREADS} O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- # 注意,产生的结果: ls -l /tmp/BE/linux/kernel-out/vmlinux #就我而言: #-rwxr-xr-x 1 root root 26179040 二月 25 22:48 /tmp/BE/linux/kernel-out/vmlinux # Linux 将 vmlinux 压缩成 bzImage # 注意:pwd = /tmp/BE/linux/linux 使 bzImage O=../kernel-out/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 查找 ${PREFIX} -iname vmlinuz
但我目前陷入了最后一步,即从 vmlinux 创建 bzImage。显然,你不能只将 vmlinux 压缩为 vmlinuz,它需要使用make bzImage
.但这会产生错误:
# 提醒:pwd = /tmp/BE/linux/linux make[1]: 进入目录 '/tmp/BE/linux/kernel-out' make[1]: *** 没有规则可以创建目标“bzImage”。停止。 make[1]: 离开目录 '/tmp/BE/linux/kernel-out' make: *** [Makefile:185: __sub-make] 错误 2
欢迎对 bzImage 问题提供任何帮助,但通常我的问题是指为 ARM64 平台交叉编译 Linux 内核的整个过程。
欢迎就我在这里使用 GCC 和 binutils 做的事情是否正确提供任何建议。我确实到处遇到一些 GCC 错误。但 vmlinux 确实编译了。我想首先测试生成的 vmlinux,将其转换为 vmlinuz 并修改 Ubuntu 中的现有 SD 卡映像。
我希望编辑我的问题,以便该脚本对于其他想要为其 RPi4 或其他设备编译 ARM64 Linux 内核的人有用。
答案1
显然,编译 Linux 内核的正确过程对于每个平台都是不同的:
# 在 32 位 x86 上 制作 bzImage # 在 64 位 x86 上 制作 zImage # 在 64 位 ARM 上 制作图像 # 在当前目录中搜索编译好的linux内核 查找./-iname“*图像”