【树莓派学习笔记】从armv7l到aarch64

树莓派很早就支持64位操作系统了,只是近几年Raspberry Pi OS才发布arm64版本。
虽然笔者的树莓派4b内存是4GB,理论上没有必要升级64位,但既然是折腾,那就不嫌麻烦,干就完了。

新的风扇

之前笔者的树莓派安装了金属散热外壳和风扇,由于常年运转,风扇受损,噪音极大。
笔者不堪其扰,更换风扇,加装防护网,档次有所提升。

新风扇

从32位切换到ARM64

执行uname -a指令查看linux版本。

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux

上面的输出结果不是笔者树莓派的输出,笔者撰写本文时树莓派已经升级到64位。

切换

想要升级到64位系统,可以重刷系统,从做sd卡开始。笔者的树莓派上运行了一些常用服务(代理、校园网认证、邮件发送ip等),重新配置比较麻烦。
树莓派官方在系统里提供了64位的镜像。执行指令ls /boot查看boot分区的文件。

$ ls /boot
 bcm2708-rpi-b.dtb          bcm2711-rpi-cm4.dtb               kernel7.img
 bcm2708-rpi-b-plus.dtb     bootcode.bin                      kernel7l.img
 bcm2708-rpi-b-rev1.dtb     cmdline.txt                       kernel8.img
 bcm2708-rpi-cm.dtb         config.txt                        kernel.img
 bcm2708-rpi-zero.dtb       COPYING.linux                     LICENCE.broadcom
 bcm2708-rpi-zero-w.dtb     fixup4cd.dat                      overlays
 bcm2709-rpi-2-b.dtb        fixup4.dat                        start4cd.elf
 bcm2710-rpi-2-b.dtb        fixup4db.dat                      start4db.elf
 bcm2710-rpi-3-b.dtb        fixup4x.dat                       start4.elf
 bcm2710-rpi-3-b-plus.dtb   fixup_cd.dat                      start4x.elf
 bcm2710-rpi-cm3.dtb        fixup.dat                         start_cd.elf
 bcm2710-rpi-zero-2.dtb     fixup_db.dat                      start_db.elf
 bcm2710-rpi-zero-2-w.dtb   fixup_x.dat                       start.elf
 bcm2711-rpi-400.dtb        initrd.img-4.19.75-v7l+-overlay   start_x.elf
 bcm2711-rpi-4-b.dtb        issue.txt                        'System Volume Information'

注意到其中的kernel8.img就是64位镜像。

修改/boot/config.txt使操作系统默认64位启动。在最后添加一行arm_64bit=1和一行kernel=kernel8.img

# file: /boot/config.txt
...

[all]
dtoverlay=vc4-fkms-v3d
enable_uart=1
start_x=1
gpu_mem=256
arm_64bit=1
kernel=kernel8.img

完成之后重启。

sudo reboot 0

开启32位兼容和软件源更新

正常来说重启之后就是64位系统了。

$ uname -a
Linux raspberrypi 5.10.103-v8+ #1529 SMP PREEMPT Tue Mar 8 12:26:46 GMT 2022 aarch64 GNU/Linu

为了能运行32位程序,需要开启兼容。

dpkg --add-architecture armhf

之前的软件源设置的是32位的,现在更换到64位。参考清华大学开源镜像站教程

修改完成之后更新。

sudo apt update
sudo apt upgrade

问题

在升级到64位之后执行如下指令。

$ getconf LONG_BIT
32

可以看到,系统仍然是32位的。为了进一步测试,编写如下C语言代码并编译执行。

#include <stdio.h>

int main() {
    printf("%ld\n", sizeof(size_t));
    return 0;
}

输出结果为4,即4字节。

在查阅相关资料后,笔者发现修改/boot/config.txt的方法虽然能将内核切换到64位,但用户态下仍然是32位。

树莓派论坛里对这种操作的评价是“不是个好主意”。

No. That only changes the kernel. The rest of the OS is still 32-bit.

结论

想要完全切换到64位系统,重刷SD卡不可避免。

拓展阅读

修改为64位:笔记:把树莓派4B系统修改为64位

修改为64位:把32位树莓派改位64位

切换为64位:树莓派4b切换64位系统

开启32位兼容:树莓派64位系统开启32位兼容

修改软件源:Raspbian 镜像使用帮助

升级到64位:Is it possible to update Raspbian 32bit with the 64bit beta without erasing the SD card?