树莓派Linux内核配置

news2024/11/6 3:12:07

文章目录

  • 一、嵌入式带操作系统的启动过程
  • 二、Linux内核源码树扫盲分析
  • 三、树莓派Linux源码配置
    • 1.树莓派Linux的内核配置
  • 2.树莓派Linux内核编译
  • 3、更换树莓派内核

一、嵌入式带操作系统的启动过程

1.x86,Intel的启动过程:
电源上电->BIOS->Windows内核->C盘,D盘->应用程序启动
2.嵌入式产品(例如:树莓派、全志、海思)启动过程:
电源上电->BootLoader->Linux内核->文件系统 (文件系统介绍)->应用程序
3.安卓的启动过程:
电源上电->fastBoot/Bootloader/->linux内核->文件系统->虚拟机->HOME应用程序->通过图标打开某APP

二、Linux内核源码树扫盲分析

Linux源码大约1.3w个文件,支持多架构多平台代码,但是Linux内核编译出来一般就几M因为支持多平台,多架构,所以编译之前需要配置,配置成适合的目标平台来用。
Linux内核源码代码目录树结构:
arch目录:不同平台体系相关代码;
block目录:块驱动设备
certs目录:与认证和签名相关代码
crypto目录:内核常用加密、压缩算法等代码;
Documentation目录:描述模块功能与协议规范代码;
Drivers目录:驱动程序(USB总线、PCI总线、显卡驱动等等);
firmware目录:主要是一些二进制固件;
fs目录:虚拟文件系统代码;
include目录:内核源码依赖绝大部分头文件;
init目录:内核初始化代码,联系到内存各组件入口;
ipc目录:进程间通信,比如共享内存、信号量匿名管道等等;
kernel目录:内核核心代码,包括进程管理、IRQ、时间等等;
lib目录:C标准库的子集;
mm目录:内存管理相关实现;
net目录:网络协议代码,比如TCP、IPv6、WiFi、以太网实现等等;
samples目录:内核实列代码;
scripts目录:编译和配置内核所需脚本;Perl/bash
security目录:内核安全模型相关代码;如selinux
sound目录:声卡驱动源码;
tools目录:与内核交互;
usr目录:用户打包和压缩内核的实现源码;
virt目录:/kvm虚拟化目录相关支持实现。

三、树莓派Linux源码配置

配置的最终目标是生成.config文件,该文件指导Makefile去把有用的东西组织成内核,配置的方式主要有以下几种
方式一:厂家会配linux内核源码,厂家会提供对于芯片的内核源码,拷贝厂家的.cinfig文件进行配置
方式二:make menuconfig 一项项配置 ,通常是基于厂家的config来配置
方式三:完全自己来

1.树莓派Linux的内核配置

STEP 1: 安装树莓派的交叉编译工具链
(1)进入树莓派官网 点这里进入
在这里插入图片描述
下载完之后将其拷贝至Ubuntu内并解压:

unzip tools-master.zip

在这里插入图片描述
(2)配置交叉编译工具环境变量
进入解压好的文件夹,进入arm-bcm2708文件夹,根据电脑位数进入相应交叉编译工具的文件夹,我这里是64位
在这里插入图片描述
进入bin目录,这里便有树莓派所用的交叉编译工具
在这里插入图片描述
获取这个文件的位置,并将其加入环境变量:
在这里插入图片描述

a.环境变量临时有效
键入下列内容

 export PATH=$PATH:/home/zh/tool-master/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

b.环境变量永久有效
打开 ~/.bashrc隐藏文件

vi ~/.bashrc

将环境变量加入其最后位置:
在这里插入图片描述

在另一个终端测试 发现可以用到交叉编译工具
在这里插入图片描述

STEP 2 :下载树莓派内核源码 树莓派官网 ,并将其拷贝到Ubuntu并解压
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
STEP 3:树莓派内核配置
进入内核源码文件夹键入下列内容,进行内核配置

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

ARCH:指定ARM架构
CROSS_COMPILE:指定编译器
KERNEL=kernel7:树莓派专有
make bcm2709_defconfig:使用的配置文件(主要核心指令)
在这里插入图片描述

2.树莓派Linux内核编译

STEP 1: 下载必须要用的库:

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

STEP 2 :树莓派Linux内核编译:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

ARCH:指定ARM架构
CROSS_COMPILE:指定编译器
KERNEL=kernel7:树莓派专有
j4:指定用多少电脑资源进行编译 (j4表示4核)
zImage:生成内核镜像
modules:生成驱动模块
dtbs:生成配置文件
在这里插入图片描述

编译成功后,在源码树目录多了vmlinux,失败则无此文件
在这里插入图片描述

成功后,目标zImage镜像在arch/arm/boot 目录下
在这里插入图片描述

3、更换树莓派内核

STEP 1:用mkknlimg 工具打包zImage 文件,将生成的zImage打包成树莓派可用的xxx.img比如kernel_new.img。

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

在这里插入图片描述
STEP 2: 插入带有树莓派系统的内存卡的读卡器并挂载到虚拟机,并键入dmesg命令后出现sda1和sda2表示连接成功
在这里插入图片描述

在这里插入图片描述
STEP 3:在根目录新建两个文件夹data1、data2并将U盘里的内容挂载到这两个文件夹中

mkdir data1 data2
sudo mount /dev/sdb1 data1   
sudo mount /dev/sdb2 data2   

sdb1即data1是fat分区,是boot相关的内容,kernel的img
在这里插入图片描述

sdb2即data2是ext4分区,也就是系统的根目录分区。
在这里插入图片描述
STEP 4 :安装modules, 用于安装设备驱动文件,像无线网卡,IIC等驱动设备
进入树莓派源码树目录键入

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install

[ext4]中挂载ext4分区的目录,因此我这里键入的命令为:

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

在这里插入图片描述
STEP 5:更新 kernel.img 文件
之前用 mkknlimg 工具打包了kernel_new.img文件,只要把它复制到fat分区(data1)并配置使用即可

首先备份之前的kernel.img 文件 ,防止刷机失败,进入挂载fat分区(data1)文件键入下列命令:

cp kernel7.img kernel7OLD.img

在这里插入图片描述
然后将之前在源码树目录生成的kernel_new.img拷贝到fat分区(data1)并替代之前的kernel7.img

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

拷贝完成后需要校验md5值,如果两文件的md5值不一样则需要重行拷贝,仿真文件却少。

md5sum /home/zh/SYSTEM/linux-rpi-4.14.y/kernel_new.img 
md5sum kernel7.img

在这里插入图片描述
STEP 6:在源码树中复制其它配置文件到fat分区(data1)

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

在这里插入图片描述
STEP 7:将配置玩的内存卡放入树莓派中键入uname -r查看更换后的内核版

在这里插入图片描述
可以发现内核已经更换,之前的内核版本为4.14.114-v7+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP基础(2)

PHP基础常用函数数组及多维数组数组遍历强制类型转换运算符赋值与基本运算字符串运算逻辑运算符常用函数 substr的用法是:substr(目标字符串,从字符串的哪个位置开始,然后返回往后的几个字符)strchr的用法是&#xff1…

【华为OD机试模拟题】用 C++ 实现 - 滑动求和(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

几张图带你看懂Unicode和UTF-8

一、二进制 为什么要编码? 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0) 我们用QQ给其他人发消息、发文件、发表情,最终会以二进制形式在网路中传输&#xff…

【多线程与高并发】- 浅谈volatile

浅谈volatile简介JMM概述volatile的特性1、可见性举个例子总结2、无法保证原子性举个例子分析使用volatile对原子性测试使用锁的机制总结3、禁止指令重排什么是指令重排序重排序怎么提高执行速度重排序的问题所在volatile禁止指令重排序内存屏障(Memory Barrier)作用volatile内…

验证性因子分析(CFA)全流程

案例与数据 某研究者想要研究关于教师懈怠感的课题,教师懈怠感是指教师在教育情境的要求下,由于无法有效应对工作压力与挫折而产生的情绪低落、态度消极状态,这种状态甚至会引发心理、生理的困扰,终至对教育工作产生厌倦&#xf…

实例8:机器人的空间描述和变换仿真

实例8:机器人的空间描述和变换仿真 实验目的 通过刚体与刚体的平动、转动基础知识的学习,熟悉位姿的描述通过Python编程实践,可视化学习坐标系的变换,熟悉空间变换 实验要求 建立一个原点位于零点的三维正交坐标系&#xff0c…

SQL零基础入门学习(十二)

SQL零基础入门学习(SQL约束) SQL CREATE INDEX 语句 CREATE INDEX 语句用于在表中创建索引。 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。 索引 您可以在表中创建索引,以便更加快速高效地查询数据。 用…

WooCommerce 上传文件 Vanquish v71.6

今天用wp 搭一个b2c外贸跨境电商网站 找 了一个文件上传插件,可以 上传无限数量的文件,没有文件大小限制WooCommerce 上传文件允许您上传无限数量的文件,没有任何文件大小限制。得益于其创新的块上传技术,它可以不受限制地上传任何…

【华为OD机试模拟题】用 C++ 实现 - 数据分类(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

记一次SSM项目启动过程中遇到的问题(找不到符号)

最近拿了朋友的SSM项目过来参考一下开发过程,然后我这边个人情况是没有学过Java的,环境也不太清楚,虽然之前有在学校过程中做过一个旅游网站类似的SSM项目,电脑环境配置还是有些不太了解,bug修了2天大概,然…

windows下编译leveldb(动态库+静态库)

环境准备 1)下载cmake并安装 下载路径: https://cmake.org/download/2)下载leveldb源码 git clone https://github.com/google/leveldb.git3)下载googletest和benchmark,cmake编译时需要 # 进入leveldb源码路径下的third_part…

干了2年的手工点点点,感觉每天浑浑噩噩,我的自动化测试之路...

作为一个测试人员,从业年期从事手工测试的工作是没有太多坏处的,当然,如果一直点来点去那么确实自身得不到提高,这时候选择学习自动化测试是一件很有必要的事情,一来将自己从繁重的重复工作中解放出来,从事…

操作系统——6.系统调用

目录 1.概述 2.系统调用的定义和作用 2.1 定义 2.2 功能 2.3 分类 3.系统调用和库函数的区别 4.系统调用背后的过程 5.小结 1.概述 这篇文章我们主要来介绍一下操作系统中的系统调用,下面来看一下具体的框架图: 2.系统调用的定义和作用 2.1 定…

Mysql索引学习

1. 索引 1.1 索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引…

Linux->进程优先级

目录 1. 优先级的概念 2. 优先级的运作方式 3. Linux下查看进程优先级以及调整 3.1 查看进程优先级 3.2 修改进程优先级 1. 优先级的概念 1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。 2. 优先权高的进程有优先执行权利。配…

数据结构:二叉树概念篇(算法基础)

目录 一.有向树的图论基础 1.有向树的相关基本概念 有向树的基本定义: 有向树的结点的度: 有向树的度: 有向树的根结点,分枝结点,叶结点: 树的子树: 树结点的层次: 树的高度: 2.一个基本的数学结论 3.有序有向树 二.数据结构中树的顺序存储结构与链式存…

【华为OD机试模拟题】用 C++ 实现 - 星际篮球争霸赛(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【log】操作类日志处理 与 报错类日志处理logback

文章目录一、操作类日志处理【环绕增强】aop环绕增强导包第一步:自定义注解interface第二步:在Controller写一个测试的方法:第三步:编写LogAspect增强类与增强方法日志写入数据库(使用mybatis)第一步&#…

C/C++每日一练(20230225)

目录 1. 工龄问题求解 ★ 2. 字符图形输出 ★★ 3. LRU 缓存机制 ★★★ 1. 工龄问题求解 给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。输入首先给出正整数N,即员工总人数; 随后给出N个整数,即每个员工…

图像分割评价指标:Dice和MIoU

目录Dice理论代码MIou理论查准率 precison查全率 recallMIoU 平均交并比代码高效的矩阵运算低效的好理解的计算混淆矩阵Dice和MIoU两者的关系参考链接Dice 理论 Dice用来衡量预测结果pred和标签label的相似度,公式如下图所示,即两个集合的交集/并集。 …