运行环境
- 运行环境:Raspberry Pi 4B 4G | Raspbian Buster Lite 2020-02-13
- 编译环境:Debian Buster AMD64 For WSL
- 编译工具:官方的交叉编译链 | Linaro的交叉编译链
- 参考借鉴:官方内核编译教程 | 为树莓派4B编译64位内核 | 树莓派启动流程
准备工作
要编译64位的内核必须要使用64位工具链和系统,而Raspbian是32位的所以只能交叉编译
安装编译所需工具和交叉编译链
1 | sudo apt install git bc bison flex libssl-dev make libncurses-dev gcc-aarch64-linux-gnu |
- 如需使用Linaro的交叉编译链请按这步操作,主要是可以自定义编译器版本,否则跳过
1 | # 下载并配置交叉编译链到系统环境 |
- 当前树莓派官方默认的内核是4.19版本,如需其他内核版本请自选
1 | # export all_proxy="127.0.0.1:7890" # 设置代理,没有跳过 |
开始编译
1 | cd linux/ |
开启虚拟
在内核的字符配置界面根据下面参数来开启内核对KVM的支持
下面参数中符号
>
代表上下级菜单,符号-
表示同级菜单下
1 | KVM :Virtualization > Kernel-based Virtual Machine support |
- 上面参数打开后会包含但不限于以下功能:
1 | 1. virtio # 标准虚拟磁盘 |
拷贝文件
- 安装内核模块和头文件到临时文件夹/home/leux/rpi4/kernel/下
1 | sudo su # 切换到root用户再安装模块,否则模块权限将混乱 |
- 保存内核及设备树到临时文件夹
1 | cd /home/leux/rpi4/kernel/ && mkdir -p boot/overlays |
- 将保存的内核及模块复制到官方Raspbian系统的对应位置
1 | # arm64的内核不提供自解压功能,让Bootloader解压除外,所以必须是未压缩的映像文件 |
- 在官方Raspbian系统上通过chroot使用KVM
1 | # 因为Raspbian的Rootfs是32位的,而KVM的基本条件就是64位QEMU |
引导程序
官方的bootloader并不开源,但是提供了二进制文件下载
以前的树莓派都是使用GPU加载bootcode.bin和fixup.dat来对内存等进行初始化并使用start.elf启动kernel.img,而4B因为有了EEPROM所以不再加载bootcode.bin而是直接加载start4.elf和fixup4.dat来启动kernel.img
想要树莓派4B启动Linux,boot分区下必须拥有以下七个文件:
1 | fixup4.dat start4.elf :适用于4B的引导程序 |
- 官方对引导程序的说明
1 | 稳定版:fixup.dat 和start.elf # 后面带4的为树莓派4B的版本 |
- 配置支持功能文件config.txt
1 | arm_64bit=1 # 启用64位内核 |
- 设置内核引导文件cmdline.txt
1 | console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 fsck.repair=yes rootwait quiet |
将上面七个文件保存的文件或文件夹复制到SD卡的boot分区就可以用来引导了
要完整的启动Linux系统还需要rootfs,有rootfs的话还需要把前面生成的内核模块复制到对应路径下