树莓派内核源码得获取,配置, 编译,裁剪

本文介绍如何获取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/
树莓派内核源码得获取,配置, 编译,裁剪_第1张图片
具体使用的版本取决于树莓派的版本," uname -r "可查看树莓派的版本,我这里是4.14的所以我下载的是4.14的
树莓派内核源码得获取,配置, 编译,裁剪_第2张图片

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:指定内核版本
    树莓派内核源码得获取,配置, 编译,裁剪_第3张图片
  • 上下左右键进行操作
  • 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卡是否挂在成功

树莓派内核源码得获取,配置, 编译,裁剪_第4张图片
到此 ,表示挂在成功

把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分区):存放存放根目录)
树莓派内核源码得获取,配置, 编译,裁剪_第5张图片

  • 3、安装modules(设备驱动文件: hdmi usb wifi io …)
    modules安装在ext4分区也就是我们的data2分区
    安装modules的路径是我们源码的路径
    树莓派内核源码得获取,配置, 编译,裁剪_第6张图片
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

树莓派内核源码得获取,配置, 编译,裁剪_第7张图片

  • 1.避免刷机失败我们把kernel7.img备份一下
    树莓派内核源码得获取,配置, 编译,裁剪_第8张图片
  • 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
    树莓派内核源码得获取,配置, 编译,裁剪_第9张图片
  • 3.查看内核的版本是否和我们开始下载的一致
uname -r

在这里插入图片描述

和我们最开始的内核版本4.14.98-v7+ 不一致 ,和我们下载的内核版本一致,成功

希望可以帮助到小伙伴们

你可能感兴趣的:(树莓派)