本文介绍如何获取linux内核代码,并完成编译、配置,内核替换。
为什么要进行树莓派的源码配置呢?
是为了驱动代码的编写,驱动代码的编译需要一个提前编译好的内核,编译内核就必须配置,配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核
1.树莓派源码的获取,交叉编译等工具
注意:
- 1、树莓派里安装的系统镜像版本要和kernel代码对应。因为树莓派系统是在不断开发和升级的,如果你的树莓派使用的是某个时间的系统镜像,那么最好也使用当时的kernel代码。这里我使用得内核版本是4.14.98-v7+,那么我下载的也是4.14版本的代码
- 2、关于内核编译方法,官网有很详细的介绍:https://www.raspberrypi.org/documentation/linux/kernel/building.md,这里算是翻译和补充。
- 3、以下编译过程在树莓派1和树莓派3B上测试ok。
2.编译交叉工具的获取
参考博文:https://blog.csdn.net/weixin_45309916/article/details/107518590
3.内核源码的获取
源码:https://github.com/raspberrypi/
具体使用的版本取决于树莓派的版本," uname -r "可查看树莓派的版本,我这里是4.14的所以我下载的是4.14的
4.修改配置文件 配置config
第一种方式:(推荐使用)
- 1.厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
- cp 厂家.config .config (树莓派1的工程是bcmrpi_defconfig,树莓派2、3的工程是bcm2709_defconfig)
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定ARM架构 指定编译器 树莓派内核 主要核心指令
- ARCH=arm:指定为RAM架构
- CROSS_COMPILE=arm-linux-gnueabihf- :指定编译器
- KERNEL=kernel7:指定内核版本
我已经配置过了所以不会有相关的信息打印
第二种方式:
- . make menuconfig 一项项配置,通常是基于厂家的config来配置 (需要安装ncurse库,下面有介绍)
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig
#指定ARM架构 指定编译器 树莓派内核 主要核心指令
- ARCH=arm:指定为RAM架构
- CROSS_COMPILE=arm-linux-gnueabihf- :指定编译器
- KERNEL=kernel7:指定内核版本
- 上下左右键进行操作
- Enter进入下一个子菜单(末尾带箭头的会有子菜单)
- " M " 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
- " * " 编译进内核 zImage包含了驱动
第三种方式:
- 完全自己来
5.编译
安装必要的库:
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 -j4 zImage modules dtbs
- ARCH=arm:指定为RAM架构
- CROSS_COMPILE=arm-linux-gnueabihf- :指定编译器
- KERNEL=kernel7:指定内核版本
- -j4:四核处理器来编译(可根据虚拟机的硬件来更改)
- zImage:生成内核镜像
- modules:生成的驱动模块
- dtbs:配置文件等等
我电脑是编译了10多分钟,看自己电脑的配置
- 查看是否编译成功:源码树目录下会生成" vmlinux " (没有压缩的Linux)
- 真正的生成的Linux内核在源码树目录下 arch/arm/boot 下生成的 " zImage "
- 成功后打包zImage成树莓派可用的xxx.img
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
6.挂载树莓派sd卡,并安装编译出的DIRECTLY 到sd卡
输入命令 " dmesg "看看SD卡是否挂在成功
到此 ,表示挂在成功
把sdb1和sdb2挂到我们的Ubuntu这边来
把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。
- 1.创建两个文件夹
data1–>fat分区–>放置镜像文件
data2–>ext4分区–>放置根目录文件
- 2.挂载sdb1和sdb2 到 data1 data2
sudo mount /dev/sdb1 data1
sudo mount /dev/sdb2 data2
此时data1和data2就有数据了(data1:(fat分区) 放置内核镜像 data2(ext4分区):存放存放根目录)
- 3、安装modules(设备驱动文件: hdmi usb wifi io …)
modules安装在ext4分区也就是我们的data2分区
安装modules的路径是我们源码的路径
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/qingmu/work/linux-rpi-4.14/data2 modules_install
INSTALL_MOD_PATH:这里用的绝对路径避免出错
操作ext4(data2)分区,需要root权限。
- 5、安装更新 kernel7.img
- 1.避免刷机失败我们把kernel7.img备份一下
- 2.再把编译新生成的kernel_new.img(源码树目录下)拷贝到data1,起名kernel7.img(直接覆盖掉)
cp kernel_new.img ../data1/kernel7.img
- 3.拷贝配置文件
cp arch/arm/boot/dts/.*dtb* /home/chenlc/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/chenlc/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/chenlc/data1/overlays/
注意路径问题,这里是我的路径,要根据自己的路径来,不要出错
7.断开SD开的连接 把SD开的连接接到电脑上
1.修改codline.txt文件
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
** 2.修改config.tex文件**
在文件的末尾加上(如果有这句,就不需要加)
dtoverlay=pi3-miniuart-bt
8.用串口连接树莓派看是否成功
- 1.把SD卡插回树莓派
- 2.开启串口启动树莓派
注意要带上串口的USB
- 3.查看内核的版本是否和我们开始下载的一致
uname -r
和我们最开始的内核版本4.14.98-v7+ 不一致 ,和我们下载的内核版本一致,成功
希望可以帮助到小伙伴们