树莓派 3B Linux 的源码配置和内核的编译讲解_一休的那些年的博客 - CSDN 博客 (1)
2023-6-21
| 2023-6-21
0  |  0 分钟

树莓派 3B Linux 的源码配置和内核的编译讲解

一、下载内核源码交叉编译工具链

内核源码下载网址: http://codechina.csdn.net/mirrors/raspberrypi/linux/-/tree/rpi-4.14.y
交叉编译工具链下载网址: https://github.com/raspberrypi/tools
注:树莓派里安装的系统镜像版本要和 kernel 代码对应
因为树莓派系统是在不断开发和升级的,如果你的树莓派使用的是某个时间的系统镜像,那么最好也使用当时的 kernel 代码

如何选择内核源码

在树莓派上输入下面的指令来查看树莓派里安装的系统镜像版本
对于树莓派 3B(使用的镜像版本的时间是 2019-04-08):其内核版本是 4.14.98-v7+,所以选择 4.14 版本的代码;只需直接访问上面所给的网址,点击 clone 下载,即可;
不是该内核版本的,可以通过下图最左边的下拉框来选择
notion image

二、解压和环境的配置

解压

将压缩包拷贝到 Ubuntu 上,并在压缩包的路径下进行解压

交叉编译工具链环境的配置

进入到 home/tao/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin 目录下
由于使用的是 64 位的电脑进行交叉编译,所以需要进入 gcc-linaro-arm-linux-gnueabihf-raspbian-x64 这个文件里
使用的是该目录下的 arm-linux-gnueabihf-gcc 指令,进行交叉编译
为了便捷的使用该指令(在使用 arm-linux-gnueabihf-gcc 时,省去前面 home/tao/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin 这些冗长的路径,直接 arm-linux-gnueabihf-gcc 即可),并且使系统能够识别 arm-linux-gnueabihf-gcc 该指令(能够自动补全),在使用交叉编译工具时就需要配置变量环境

配置环境的方法

在 Linux 里通过指令 echo $PATH 查看当前的环境变量
在当前的环境变量的后面加上 home/tao/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin(路径因人而异,仅供参考)
1、临时有效(换个窗口就无效了)
通过 export 指令进行环境变量的配置
2、永久有效

三、Ubuntu 上配置 config

注:下面的所有操作都是在 linux-rpi-4.14.y/ 目录下进行的
方法 1、使用源码里自带的 config
内核配置的指令
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
内核配置指令里的组成部分:
ARCH=arm: 指定 ARM 架构
CROSS_COMPILE=arm-linux-gnueabihf-: 指定编译器为树莓派的交叉编译工具链
KERNEL=kernel7: 主要核心指令
make bcm2709_defconfig: 获取 bcm2709_defconfig 工程的配置到. config
不同的树莓派的核心不同:
树莓派 1:
KERNEL=kernel
工程是 bcmrpi_defconfig
树莓派 2、3、3B:
KERNEL=kernel7
工程是 bcm2709_defconfig
树莓派 4:
KERNEL=kernel7l(是英文 “L” 的小写字母)
工程是 bcm2711_defconfig
方法 2、使用当前树莓派的 config,以防丢失原来使用的树莓派的配置
加载模块:sudo modprobe configs =====================================================================
把 /proc/config.gz 内容复制到要编译的电脑上
解压,保存为. confg 文件。
zcat config.gz > .config
注:必须在 linux 环境下解压
把此 config 文件复制到 linux 源码的根目录
配置的方式有三种
第一种方式:在 make menuconfig 配置时,配置为 * 编译进内核 ,使得 zImage 包含了驱动
第二种方式:在 make menuconfig 配置时,配置为 M 模块方式生成驱动文件 xxx.ko;系统启动后,通过命令 sudo inmosd xxx.ko 进行加载
驱动两种加载方式:
第一种方式:在 make menuconfig 配置时,配置为 * 编译进内核 ,使得 zImage 包含了驱动
第二种方式:在 make menuconfig 配置时,配置为 M 模块方式生成驱动文件 xxx.ko;系统启动后,通过命令 sudo inmosd xxx.ko 进行加载

四、Ubuntu 上编译内核

执行以下指令来安装必要的库:
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
注:下面的操作都是在 linux-rpi-4.14.y / 目录下进行的

1、内核编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage
ARCH=arm: 指定 ARM 架构
CROSS_COMPILE=arm-linux-gnueabihf-: 指定编译器为树莓派的交叉编译工具链
KERNEL=kernel7: 主要核心指令
-j4: 指定用多少电脑资源进行编译,来加快编译的速度
zImage: 生成内核镜像
modules: 生成驱动模块
dtbs: 生成配置文件

2、查看源码树目录是否多了 vmlinux

编译成功后,看到源码树目录多了 vmlinux, 失败则无此文件
成功后,目标 zImage 镜像在 arch/arm/boot 底下

3、打包 zImage 成树莓派可用的 xxx.img

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

4、数据拷贝到树莓派

创建两个用于挂载树莓派 SD 卡的文件
mkdir data1 data2
挂载 U 盘
sudo mount /dev/sdb1 data1 挂载 fat 分区,包含 boot 相关的内容,kernel 的 img
sudo mount /dev/sdb2 data2 挂载 ext4 分区,也就是系统的根目录分区
安装 modules, 设备驱动文件: hdmi usb wifi io …
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/tao/data2 modules_install
安装更新 kernel.img 文件,注意镜像名字是 kernel7.img
先备份
进入到 data1 文件里
cp kernel7.img kernel7OLD.img
再把编译新生成镜像文件拷贝到 data1,起名 kernel7.img
cp kernel_new.img /home/tao/data1/kernel7.img
拷贝配置文件
cp arch/arm/boot/dts/._dtb_ /home/tao/data1
拷贝其他文件
cp arch/arm/boot/dts/overlays/.dtb* /home/tao/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/tao/data1/overlays/

5、检查树莓派内核更新是否成功

更新完成后将 SD 卡插回树莓派即可开机,开机后可以用 uname -r 命令查看内核版本是否改变 > 本文由简悦 SimpRead 转码
目录