在Ubuntu18.04下编译树莓派4B的Arm64内核

18 篇文章 20 订阅

默认的树莓派镜像Raspbian启动的是Linux的32位4.19内核,但是笔者想将其替换成5.4.y版本的64位内核。当然也可以直接在树莓派上编译,不过这样速度比较慢,所以还是选择在Ubuntu18.04上交叉编译。

1)首先,要安装基本的依赖库:

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

2)然后,可以去官网下载最新的Raspbian内核:

git clone --depth=1 --branch rpi-5.4.y https://github.com/raspberrypi/linux

加上--depth=1参数使得只会下载最新的一次commit,能加快速度,但是后面更新代码有点麻烦,如果网速够快且磁盘空间够大可以去掉。

3)由于是交叉编译(在X86_64环境下编译Arm64),所以需要下载Linaro编译工具,并配置编译环境。

可以通过wget下载:

wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

下载完成后,将文件解压缩到制定目录,并配置好环境变量:

tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
mv ./gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu ~/gcc-linaro
vim ~/.bashrc

在.bashrc后面加上:

export PATH=$PATH:~/gcc-linaro/bin

然后执行:

source ~/.bashrc

4)下面就可以进入内核目录编译了:

cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

上面命令用于生成默认的内核配置文件。完成上面步骤后,使用下面命令正式启动编译过程:

make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

整个编译时间可能会比较长,根据编译机器的硬件处理器数量来制定同时使用多少线程编译(-j{n},笔者同时使用8个任务)。

编译完成后会在arch/arm64/boot目录下生成Image文件和所有的dts文件。当然,还有一个重要的文件System.map生成在内核源码根目录下。

5)一切准备就绪,可以覆盖SD卡上的内核文件了。

将SD卡插入计算机,会出现两个分区(如果没出现,可以自行挂载)。一个是fat32分区,名字叫boot;另一个是ext4分区,名字叫rootfs。

boot分区是启动分区,内核镜像和dts编译后的dtb文件要放到这个分区上,同时还有一个config.txt配置文件。而rootfs分区是系统文件系统根目录的分区,模块文件要放到这个分区上。

先拷贝内核文件:

sudo cp linux/arch/arm64/boot/Image /media/roland/boot/kernel8.img
sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb /media/roland/boot/
sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* /media/roland/boot/overlays/
sudo cp linux/arch/arm64/boot/dts/overlays/README /media/roland/boot/overlays/

将编译好的内核镜像文件Image拷贝到boot分区下的kernel8.img,这一步应该会覆盖掉原始的内核镜像,如果不放心操作之前可以备份一下。当然也可以不用这个名字,只要在下一步配置文件里面设置好就行了。后面的命令都是用来拷贝编译好的设备描述文件。

下面还要生成内核模块,这一步非常重要,否则启动的时候会报找不到设备模块。

sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/media/roland/rootfs modules_install

为什么这里还要安装模块呢?硬件驱动有许许多多,如果把所有的驱动都在编译内核的时候就指定编译到内核里面那么内核会非常大。所以编译内核的时候只编译一部分非常常用的驱动,这些驱动在Linux内核配置的时候指定为“*”。还有一些不怎么常用的与平台相关的驱动被指定为“M”编译,它们可以放到文件系统根分区下,等真正需要的时候再加载。对于这种驱动模块,可以用make modules编译。不过直接make,不加任何参数,就是make all,包含make modules。虽然编译了,但并没有被安装到文件系统根分区下,内核启动的时候还是找不到这些模块。make modules_install就是起这个作用的,把模块放到lib/modules目录中一个和内核名一样的目录下,并且运行depmod生成模块依赖关系文件,系统启动时加载模块就是从dep里面读取信息加载模块。由于是交叉编译,不是要将模块安装到本机,所以需要使用INSTALL_MOD_PATH参数,指定安装的根目录是SD卡的rootfs分区。

6)最后一步是修改配置文件。

树莓派默认是用32位内核启动,需要修改boot分区下的config.txt文件。在文件的末尾加上下面两行:

arm_64bit=1
kernel=kernel8.img

arm_64bit指定树莓派4是不是要以64位的方式启动,如果不设置这项但又指定了64位的内核镜像文件,会没有任何显示输出。

kernel指定了内核镜像文件的名字,只需要跟上一步拷贝的名字相同就可以了。

保存后卸载分区,将修改好后的SD卡插到树莓派4中直接启动即可。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值