[Linux服务器] Linux内核编译

93 0
Honkers 2025-3-14 04:31:57 | 显示全部楼层 |阅读模式

目录

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

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

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

方式1

方式2

方式3

交叉编译主机编译内核

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

挂载SD卡到交叉编译主机

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

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

 

对于目的平台的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 

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

精英红客

关注
  • 1974
    主题
  • 35
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行