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

本文介绍如何获取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+ 不一致 ,和我们下载的内核版本一致,成功

希望可以帮助到小伙伴们

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
本资源为arm-linux下的海思编译链工具V300 C语言有三种标准库如下: 1.Glibc glibc = GNU C Library 是GNU项(GNU Project)目,所实现的 C语言标准库(C standard library)。 目前,常见的桌面和服务器中的GNU/Linux类的系统中,都是用的这套C语言标准库。 其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。 2.uClibc 一个小型的C语言标准库,主要用于嵌入式。 其最开始设计用于uClinux(注:uClinux不支持MMU),因此比较适用于微处理器中。 对应的,此处的u意思是μ,Micro,微小的意思。 uClibc的特点: (1)uClibc比glibc要小很多。 (2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。 3.EGLIBC EGLIBC = Embedded GLIBC EGLIBC是,(后来)glibc的原创作组织FSF所(新)推出的,glibc的一种变体,目的在于将glibc用于嵌入式系统。 EGLIBC的目标是: (1)保持源码和二进制级别的兼容于Glibc 源代码架构和ABI层面兼容 如果真正实现了这个目标,那意味着,你之前用glibc编译的程序,可以直接用eglibc替换,而不需要重新编译。 这样就可以复用之前的很多的程序了。 (2)降低(内存)资源占用/消耗 (3)使更多的模块为可配置的(以实现按需裁剪不需要的模块) (4)提高对于交叉编译(cross-compilation)和交叉测试(cross-testing)的支持 【目前了解到的海思交叉编译工具链的应用环境】 arm-hisiv100-linux为基于uclibc的工具链,arm-hisiv200-linux 为基于 glibc 的工具链; arm-hisiv300-linux为基于uclibc的工具链,arm-hisiv400-linux 为基于 glibc 的工具链; arm-hisiv500-linux为基于uclibc的工具链,arm-hisiv600-linux 为基于 glibc 的工具链。 (在开发的时候,你编译内核所用的交叉编译链跟用户的应用程序所用的交叉编译链一定需要相同,不然没法调用系统内核的依赖库)   其中eglibc这种很容易被人开发者忽视,从而选错了编译工具链。 uClibc和Glibc并不相同,两者有许多不同之处,有可能给你带来一些问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值