Raspberry 4B之编译内核
起因:因为官方镜像内核版本是5.x版本,比较高,需要使用4.x版本的内核做日常使用和学习用,遂进行此操作。
目标内核版本: 4.20.x
步骤:
1.下载内核:
官方内核地址(raspberry维护非linux组织)
https://github.com/raspberrypi/linux
sudo apt-get install git
git clone -b rpi-4.20.y --depth 1 https://github.com/raspberrypi/linux.git
2.安装编译交叉工具
sudo apt-get install -y gcc-arm-linux-gnueabihf
3.使用的arm架构下的bcm2711_config,若要使用arm64位架构的默认配置文件,可自行更改
make -j8 0=build ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
4.自己再进行添加自己想要的配置(或减少)
make -j8 0=build ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
注:若命令有出错的地方,提示缺少哪些包,自行查找安装即可
apt-cache search "缺少的文件" #会查找出提供功能的包,然后安装即可
- 编译
make -j8 0=build ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bzImage modules #-j8参数是使用的线程数编译,比如-j4就是使用4线程编译
或者可以编译成deb包的形式,后面使用方便
make -j8 0=build ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- deb-pkg
注:上面两个方法在使用gcc >= 10版本时会出错:
multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
需要手动注销scripts/dtc/dtc-lexer.l中对yylloc的声明,为什么改这个文件不改.c文件呢,主要原因是.c文件是这个文件生成的,在编译安装包的形式中体现的更加明显
vim scripts/dtc/dtc-lexer.l
如下图41行:
6.编译dtb
make -j8 0=build ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
7.进入目录将编译好的dtb打包
cd arch/arm/boot
tar cvf dtb.tar dts/b*.dtb dts/overlays/*.dtb
8.接下来就很简单,只需要安装两个安装包,然后将dtb.tar解压,将里面的dtb文件copy到/boot下面,再将/boot下的内核文件进行改名操作
sudo dpkg -i linux-image-4.20.17-v7l+_4.20.17-v7l+-1_armhf.deb
sudo dpkg -i linux-headers-4.20.17-v7l+_4.20.17-v7l+-1_armhf.deb
tar xvf dtb.tar
cd dtc
sudo cp -rf * /boot
sudo mv vmlinuz-4.20.17-v7l+ kernel7l.img
9.最后的处理工作。
只是这样的话,重启可能起不来,需要在/boot/config.txt中关闭"dtoverlay=vc4-fkms-v3d"选项。如下图61行所示:
然后大工搞成!
特此贴为记录,方便自己也方便他人。