目录

交叉编译主机下载目的平台的交叉编译链和内核编译所需的依赖(部分第三方库)

交叉编译主机下载目的平台的Linux内核源码

交叉编译主机配置目的平台的Linux内核

方式1

方式2

方式3

交叉编译主机编译内核

目的平台使用该编译好的内核

挂载SD卡到交叉编译主机

将内核驱动模块安装到SD卡

备份SD卡的原内核并将新内核和设备树配置文件放入SD卡中

 

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

交叉编译主机下载目的平台的交叉编译链和内核编译所需的依赖(部分第三方库)

  •  查看树莓派的位数,命令getconf LONG_BIT
    c972c29e8be74ba3a7c0fe616100afcc.jpeg
  •  安装第三方库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内核源码

交叉编译主机配置目的平台的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
    d2b43db3ff7e42f9879f5ac321d00025.png
  • ARCH:指定arm架构
    CROSS_COMPILE:指定编译器指定
    xxxconfig:指定厂家.config文件
    KERNEL:指定Linux内核

方式2

在Linux内核目录底下执行命令make menuconfig 进入图形库一项项进行配置

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

26d67b8f2dde4b6bb2f049c5fabee53b.png

方式3

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

交叉编译主机编译内核

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

  • 在Linux源码目录底下执行命令,make -j4  ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
    61ee545481de4caeab8b06ed646a653e.png
  • -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
    7c2e6a64d7c145da8216820129de39c2.png
  • 目标平台的Linux内核文件:zImage文件
    77f73aba60aa4aa090588cc358c55a94.png

目的平台使用该编译好的内核

挂载SD卡到交叉编译主机

正常SD卡会自动挂载到/media/$下的boot和rootfs目录下
11e19e6758924096ba1ce548a81f085b.png
可以看到当插入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

2f42973d9ce249c4bea26ceac3295ac1.jpeg

将内核驱动模块安装到SD卡

  • 在Linux源码(树莓派32位)目录底下执行命令,sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/linux/rootfs modules_install
    79d3ea1069d34416b09fe7cd36b24f9c.png
  • 如果是树莓派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 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐