树莓派高阶课程3:Linux内核源码目录树扫盲分析,配置Linux内核适合树莓派相关操作及内核编译,移植

Linux内核源码目录树扫盲分析

1.Linux内核源码目录树扫盲分析:

sudo apt-get install tree
tree   //查看目录树

大约1.3w个C文件:1100w行代码
Linux是开源,免费,Linux开源社区工作者共同维护
Linux是一个开源的,支持多架构多平台代码,可移植性非常高

但是Linux内核编译出来一般就几M ----4M

因为支持多平台多架构,所以编译之前要配置,配置成适合的目标平台来用
平台:ARM(海思,友善之臂,树莓派,nanopi) X86 MIPS

参考文章:
Linux内核源代码目录树结构

了解源码目录树的结构

2.配置Linux内核适合树莓派相关操作:

我们工作的时候,需要进行驱动代码编写,紧接着对驱动代码进行编译,但驱动代码的编译需要一个提前编译好的内核,编译内核就必须配置

配置的最终目标会生成 .config文件,该文件指导Makefile去吧有用的东西组织成内核。

厂家配Linux内核源码:比如说买了树莓派,厂家会给你树莓派Linux内核源码
拿到源码之后,里面包含了厂家的源码

第一种方式:

cp 厂家.config .config
find . -name *_defconfig
找到:
./arch/arm/configs/bcm2709_defconfig

第二种方式:

make menuconfig   //一项项配置,通常基于厂家的config来配置

第三种方式:

厂家本家:完全自己来

如何来配置Linux树莓派的内核?

方式一:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
//用来配置,指定编译器

此命令功能是获取bcm2709_defconfig的配置到 .config里
我们可以直接用工程里的配置,但这样的话可能会丢失原来使用的树莓派的配置,这里提供一个方法可以获取当前正在使用的树莓派的config。
在这里插入图片描述
实现把厂家.config 变成 ,config

方式二:
添加某个驱动进去
安装必要的库:

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

安装之后:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

在这里插入图片描述
驱动两种加载方式:

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

**方式三:**暂时忽略

3.Linux内核编译:

编译:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log
//arm架构,内核7,j4:指定用多少电脑资源编译,
//zImage:生成内核镜像
//modules:生成驱动模块
//dtbs:生成配置文件

以n进程编译。不指明几进程的话则默认以单进程编译。
在这里插入图片描述内核编译成功后,看到源码树多了vmlinux,失败则无此文件。
成功后,zImage是我们需要的目标镜像

cd arch/arm
cd boot
ls

在这里插入图片描述

3.Linux内核镜像拷贝至树莓派并启动新内核

打包zImage文件:

直接用linux源码包里的工具:

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

在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。
:网上很多地方说的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!

在这里插入图片描述
镜像的拷贝:
1.把树莓派断电,拔出SD卡,使用读卡器插入电脑连接至虚拟机。

dmesg    //显示可移动设备信息

在这里插入图片描述

cd  //回到根目录
mkdir data1
mkdir data2
//数据拷贝;创建两个文件夹,挂载U盘
sudo mount /dev/sdb1 data1//一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
sudo mount /dev/sdb2 data2//一个是ext4分区,也就是系统的根目录分区
//  sudo umount /dev/sdb1   //取消挂载
//data1:U盘数据   data2:根目录数据

在这里插入图片描述
data2:在这里插入图片描述

安装modules:

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/dazai/data2 modules_install

安装设备驱动文件:hdmi接口 usb WiFi io 等等;
在这里插入图片描述

更新 kernel.img 文件:

注意:镜像名字: kernel7.img

cd data1
ls
//可以看到kernel7.img 文件
cp  kernel7.img  kernel7OLD.img//做一个备份

在这里插入图片描述
再把编译新生成的拷贝到data1,起名:kernel7.img

cp kernel_new.img  /home/dazai/data1/kernel7.img

md5sum kernel_new.img//检查cp是否成功
md5sum /home/dazai/data1/kernel7.img

在这里插入图片描述
在这里插入图片描述
拷贝成功。

复制其他相关文件:

cp arch/arm/boot/dts/.*dtb* /home/dazai/data1/
cp arch/arm/boot/dts/overlays/.*dtb* /home/dazai/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/dazai/data1/overlays/

之后Ubuntu断开SD卡的处理,交由windows捕捉。
还原:
在这里插入图片描述
之后:将SD卡插回树莓派
通过串口登录观看启动过程,
树莓派终端输入:

 uname -r

在这里插入图片描述
内核版本发生了改变。
树莓派内核的配置,编译以及移植成功。
这些操作源于:
驱动代码的编译需要一个提前编译好的内核

参考文章:
树莓派-内核开发-说明 下载代码 编译 替换内核

猜你喜欢

转载自blog.csdn.net/weixin_40734514/article/details/108730597