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

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

内核源码下载网址:https://codechina.csdn.net/mirrors/raspberrypi/linux/-/tree/rpi-4.14.y
交叉编译工具链下载网址:https://github.com/raspberrypi/tools

注:树莓派里安装的系统镜像版本要和kernel代码对应
因为树莓派系统是在不断开发和升级的,如果你的树莓派使用的是某个时间的系统镜像,那么最好也使用当时的kernel代码。

如何选择内核源码

在树莓派上输入下面的指令来查看树莓派里安装的系统镜像版本

uname -r

对于树莓派3B(使用的镜像版本的时间是2019-04-08):其内核版本是4.14.98-v7+,所以选择4.14版本的代码;只需直接访问上面所给的网址,点击clone下载,即可;

不是该内核版本的,可以通过下图最左边的下拉框来选择
在这里插入图片描述

二、解压和环境的配置

解压

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

unzip tools-master.zip
unzip linux-rpi-4.14.y.zip

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

进入到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该指令(能够自动补全),就需要配置环境

配置环境的方法

通过指令 echo $PATH 查看当前的环境变量

在当前的环境变量的后面加上home/tao/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin(路径因人而异,仅供参考)

1、临时有效(换个窗口就无效了)

通过 export 指令进行环境变量的配置

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tao/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

2、永久有效

	 修改工作目录下的.bashrc 隐藏文件,配置命令终端的
	 vi /home/tao/.bashrc 
	 在文件最后一行加入:
	 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tao/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
	 source /home/tao/.bashrc 加载配置文件,马上生效配置。

三、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源码的根目录


配置的方式有三种
第一种方式:cp 厂家.config .config
第二种方式:make menuconfig 一项项配置,通常是基于厂家的config来配置
第三种方式:完全自己来

驱动两种加载方式:
第一种方式:在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 modules dtbs

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 命令查看内核版本是否改变

猜你喜欢

转载自blog.csdn.net/weixin_50438937/article/details/114040742