目录
最近打算玩玩树莓派,遂之买了一块 Raspberry 4B 的板子。板子的资源就不在多说了 BCM2711的芯片,ARM Cortex-A72 @ Qual Core;
拿到板子,SD 卡中已经带有系统,所以呢,我们可以直接在树莓派上面编译 Kernel,不用在 PC 上交叉编译,只不过呢,树莓派上编译会稍显慢,不过无所谓;
官方其实对这部分有描述,参考:
https://www.raspberrypi.org/documentation/linux/kernel/building.md
1、下载内核源码
1.1、配置 proxy
我刚刚拿到单板,准备下载源码,但是一直都报各种 Github 连接失败,所以要配置一下:
git config --global --unset http.proxy
git config --global --unset https.proxy
git config --global --unset https.https://github.com.proxy
git config --global --unset http.https://github.com.proxy
然后呢,就可以在 Github 上面下载 Raspberry 的源码了:
git clone --branch rpi-5.10.y https://github.com/raspberrypi/linux
我这里用的是 5.10 的内核,所以下载的是 5.10.y 的分支;
1.2、安装依赖
将编译阶段需要的东西安装上:
sudo apt install git bc bison flex libssl-dev make
2、配置内核
通过下面内容来进行基本的配置:
KERNEL=kernel7l
make bcm2711_defconfig
3、编译内核
通过下述方式来进行编译:
make -j4 zImage modules dtbs
接下来就是漫长的等待;
4、更新内核
将编译完毕的内核相关文件覆盖:
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
5、重启
重新启动系统,通过 uname -r 查看是否被更新;
6、问题
6.1、32bit/64bits
当前默认情况下,Raspberry 4B 跑的是 32bit 的 Kernel 使用的是 32bit 的 toolchain,从官方的文档:
https://www.raspberrypi.org/documentation/linux/kernel/building.md
可以看到,如果是 32bit 的话针对 Raspberry 4B 来说:
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
对于 64bit 的话,针对 Raspberry 4B 来说:
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
编译器使用的不一样;
上述需要在宿主机中,进行下载安装交叉编译环境进行编译;
6.2、覆盖到 SD card
在终端中,使用 lsblk 可以看到:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 29.7G 0 disk
|--mmcblk0p1 179:1 0 256M 0 part /boot
|--mmcblk0p2 179:2 0 29.5G 0 part /
mmcblk0p1 分区是启动分区,被挂载到 /boot 目录下,也就是 SD card 中存放启动内容的地方;所以在编译完 Kernel 后,往这个目录下进行覆盖的;