摘自:进阶:ubuntu配置树莓派linux内核→编译→挂载→运行新内核
作者:丶PURSUING
发布时间: 2021-02-13 20:49:50
网址:https://blog.csdn.net/weixin_44742824/article/details/113796845?spm=1001.2014.3001.5502
目录
师承陈立臣
一、配置树莓派linux内核
为什么要配置linux源码?
为驱动代码的编写做准备
例如编写树莓派的驱动代码:
linux源码配置 → 编译得到树莓派专用内核 → 在树莓派上编译驱动代码
配置的最终目标会生成.config文件,该文件指导Makefile把需要的东西组织成内核。
如何进行配置呢?
前提:获取交叉编译工具与源码
大致分为3种方法:
例如购买了树莓派,厂家会提供配置好的树莓派linux内核源码。
1.照搬厂家的配置
- 执行命令
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
- 1
注意:这个命令要在路径
/linux-rpi-4.14.y下执行,否则提示 “make: *** 没有规则可制作目标“bcm2709_defconfig”。
参数说明
| 参数 | 说明 |
|---|---|
| ARCH=arm | 指明当前要编译arm(不是arm64) |
| CROSS_COMPILE | 指明交叉工具链名称。 |
| KERNEL | 指明kernel类型,树莓派1设置为kernel,树莓派2、3设置为kernel7 |
linux源码中有很多工程:
树莓派1的工程是bcmrpi_defconfig;
树莓派2、3的工程是bcm2709_defconfig。
- 执行结果
可以发现 厂家config 变成了 .config

2.参考厂家的配置
基于厂家的config,用make menuconfig一项项配置,通常需要自主增删一些驱动
首先要安装必要的库
分别执行下列命令
- 系统自带,一般都有
sudo apt-get install bc
- 1
- 必须
sudo apt-get install libncurses5-dev libncursesw5-dev
- 1
- 必须
sudo apt-get install zlib1g:i386
- 1
- ↓ 若这一步提示“E: 无法定位软件包 lib32ncurses5”可以先留着不做
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
- 1
执行menuconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
- 1
- 可以看到如下界面

Enterselects submenus 进入子菜单带<>的
[ ]表示略过的,不参与编译
————————驱动的两种加载方式:
*built-in:表示编译进了内核,zImage包含了驱动。
Mmodularizes:表示以模块的方式生成驱动文件xxx.ko。系统启动后,通过命令inmosd xxx.ko加载
————————
空格键可以切换状态
3.完全自主配置
可以工作2-3年后在涉猎。
二、内核编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
- 1
-j4指定电脑用多少个资源来进行编译。4核(4线程),可自行调整。4核再结合电脑情况,大概要编译20分钟。如果一些工具的配置有错会在最开始就报错,一般是配置的问题。
zImage生成内核镜像
modules生成驱动模块
dtbs生成配置文件
是否成功编译?
可以看到在内核的源码树目录下生成了vmlinux(没有压缩的linux)即为成功。
而我们真正想要的目标镜像是/arch/arm/boot/zImage
三、树莓派挂载新内核
1.用linux源码包里的工具打包zImage文件成kernel_new.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
- 1
树莓派的镜像文件结尾就是
.img,这个文件就是要放到sd卡中的文件.
2.镜像拷贝
树莓派sd卡挂载到ubuntu上。
插入读卡器后按照下图配置

查看内核信息,有设备接入的时候内核会打印出驱动层面的信息。
dmesg
- 1
接入成功

sdb1,2分别是树莓派sd卡的两个分区
①一个fat分区。是boot相关的内容,kernel的img文件在此分区。
②一个是ext4分区,也就是系统的根目录分区。(cd /进入的就是系统的根目录)
数据拷贝
回到SYSTEM(是我ubuntu中linux源码存放的目录)的上一级目录(cd . .),就是下图中的/Desktop

分别创建两个文件夹并拷贝两个分区的内容
mkdir data1
- 1
mkdir data2
- 1
关联到sd卡中
sudo mount /dev/sdb1 data1
- 1
sudo mount /dev/sdb2 data2
- 1
查看data1,2分别存放的是什么
则data1为fat分区(boot相关),data2为ext4分区(系统根目录相关)一定要对应好!!!
3.安装modules
modules就是内核驱动相关,少了这一步类似网卡,wifi,usb,hdmi这些都用不了
注意:操作的是ext4分区,对应的就是data2
来到linux-rpi-1.14.y目录下。
注意将代码的“[ext4]”更改为data2的绝对路径 !!,
- 更改前
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
- 1
- 根据具体情况更改后
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/zhu/Desktop/data2 modules_install
- 1
可以看到很多的.ko文件,这与驱动相关

4.安装更新kernel.img文件
注意查看原来镜像名字是kernel7.img
ls /home/zhu/Desktop/data1
- 1
因为原来的这个kernel7.img会被覆盖,为了防止刷机失败,或者拷贝过程中文件损坏,需要提前用别名备份这个文件。
打开新的终端(ctrl alt t)(方便操作罢了),进入其存放路径(cd /home/Desktop/data1)
sudo cp kernel7.img kernel7OLD.img
- 1
从源码树目录(linux-rpi-4.14.y)拷贝kernel_new.img(是由zImage打包而成)到data1并且命名为kernel7.img覆盖原来的文件
sudo cp kernel_new.img /home/zhu/Desktop/data1/kernel7.img
- 1
自动填充时,在打到"kernel"不知道后面具体是什么,连续两下tab会罗列出来。
检查拷贝是否有问题
md5sum显示文件的唯一编码号,若相同则为同一个文件
md5sum kernel_new.img
- 1

md5sum /home/zhu/Desktop/data1/kernel7.img
- 1
拷贝正确。
5.拷贝其他文件到fat
都是从目录linux-rpi-4.14.y进行拷贝
这些配置文件是为了能够加载驱动以及一些其他的配置。
————————①
- 更改前
cp arch/arm/boot/dts/.*dtb* [fat]/
- 1
- 根据实际更改后
sudo cp arch/arm/boot/dts/.*dtb* /home/zhu/Desktop/data1/
- 1
————————②
- 更改前
cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
- 1
- 根据实际更改后
sudo cp arch/arm/boot/dts/overlays/.*dtb* /home/zhu/Desktop/data1/overlays/
- 1
————————③
- 更改前
README有没有都行
cp arch/arm/boot/dts/overlays/README [fat]/overlays/
- 1
- 根据实际更改后
sudo cp arch/arm/boot/dts/overlays/README /home/zhu/Desktop/data1/overlays/
- 1
四、在树莓派上运行
1.用window配置sd卡文件使其支持串口打印调试信息,观看启动过程
如果之前在做别的项目,例如串口编程时,会把这个配置信息删掉,这时需要添加回来。

点击选择断开连接sd卡,使其重新挂载在windows上。

打开sd卡中boot文件夹下的cmdline.txt
按照上图位置添加
console=ttyAMA0,115200
- 1
2.打开secureCRT,串口方式登陆。
sd卡插回树莓派,USB-TTL连接。
可以看到启动正常。
如何确定内核已经更换了呢?
查看内核版本号
uname -r
- 1
原来为4.14.98-v7

nice!成功啦!
其他
以M为单位计算xxx文件的大小
du xxx文件 -h
- 1
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!