对于目的平台的Linux内核的编译,一般选择交叉编译的方式,以树莓派4B为例,在Linux虚拟机上编译一个适合树莓派4B使用的Linux内核

交叉编译主机下载目的平台的交叉编译链和内核编译所需的依赖(部分第三方库)
查看树莓派的位数,命令getconf LONG_BIT



安装第三方库ncurses,命令sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
安装32位的交叉编译工具链,命令sudo apt install crossbuild-essential-armhf,如果树莓派的位数是64位,则安装64位交叉编译工具链,命令sudo apt install crossbuild-essential-arm64
交叉编译主机下载目的平台的Linux内核源码
查看树莓派的内核版本,命令uname -r



下载树莓派对应版本的Linux内核源码https://github.com/raspberrypi/



交叉编译主机配置目的平台的Linux内核
配置目标平台的Linux内核,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核

方式1
厂家一般会配有linux内核源码和配置手册,我们只需要CV就行,cp 厂家.config xxx.config
由于树莓派4B的芯片是bcm2711,我们直接使用厂家的.config文件(bcm2711_defconfig)生成新的.config文件,在linux源码目录执行命令make ARCH=arm CROSS_COMPILE=arm-linux-gnueabinf- bcm2711_defconfig KERNEL=kernel7l



ARCH:指定arm架构
CROSS_COMPILE:指定编译器指定
xxxconfig:指定厂家.config文件
KERNEL:指定Linux内核
方式2
在Linux内核目录底下执行命令make menuconfig 进入图形库一项项进行配置

*编译进内核 zImage包含了驱动
M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载



方式3
自己进行配置内核,完全自己掌握配置

交叉编译主机编译内核
编译配置好的树莓派4B 32位的Linux内核

在Linux源码目录底下执行命令,make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs



-j4:4核,指定电脑资源来编译内核
ARCH:指定架构
CROSS_COMPILE:指定编译器
-zImage:生成的内核镜像
modules:生成的驱动模块
dtbs:生成的配置文件
如果是64位,执行命令make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
编译成功后会在目标平台的Linux内核源码目录底下生成vmlinux,以及存在zImage文件

vmlinux:没有压缩过的linux



目标平台的Linux内核文件:zImage文件



目的平台使用该编译好的内核
挂载SD卡到交叉编译主机

正常SD卡会自动挂载到/media/$下的boot和rootfs目录下



可以看到当插入SD卡后,SD卡自动挂载了,如果没有自动挂载,则需要手动挂载,将识别到实际的SD卡的设备节点,将SD卡挂载到交叉编译主机上,在Linux内核源码目录底下执行以下命令

  • sudo mkdir /media/linux/rootfs -p
  • sudo mkdir /media/linux/boot -p
  • sudo mount /dev/sdb1 /media/linux/boot
  • sudo mount /dev/sdb2 /media/linux/rootfs



将内核驱动模块安装到SD卡
在Linux源码(树莓派32位)目录底下执行命令,sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/linux/rootfs modules_install



如果是树莓派64位,执行命令sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/media/linux/rootfs modules_install
备份SD卡的原内核并将新内核和设备树配置文件放入SD卡中

  • sudo cp/media/linux/boot/$KERNEL.img /media/linux/boot/$KERNEL-backup.img
  • sudo cp arch/arm/boot/zImage /media/linux/boot/$KERNEL.img
  • sudo cp arch/arm/boot/dts/_.dtb /media/linux/boot
  • sudo cp arch/arm/boot/dts/overlays/_.dtb* /media/linux/boot/overlays/
  • sudo cp arch/arm/boot/dts/overlays/README /media/linux/boot/overlays/
  • sudo umount /media/linux/boot
  • sudo umount /media/linux/rootfs