树莓派——配置Linux内核适合树莓派

2023-10-31


回顾:

  • 学习交叉编译的时候了解到树莓派的操作系统也是需要经过交叉编译后再放到树莓派上,否则无法安装gcc编译器。而平台的运行需要至少两样东西:bootloader(启动引导代码)以及操作系统核心。本文章主要分析树莓派的启动过程以及对树莓派的Linux操作系统内核进行编译,得到时候树莓派的操作系统。

将linux内核代码和编译工具tools上传到ubuntu

  1. 根据树莓派的版本【执行uname -r可以查到】,在https://github.com/raspberrypi/,下载linux工程,要对应当前树莓派的版本

在这里插入图片描述

在这里插入图片描述

  1. 下载tools工具下载交叉编译工具并配置环境变量
    参考文章:树莓派——交叉编译下的【交叉编译工具链的安装】

树莓派等芯片带操作系统的启动过程

不带操作系统的:

  • C51,STM32(裸机)》》》》》》C直接操控底层寄存器实现相关业务。 业务流程型的裸机代码
    • 遥控灯: while(1)
    • 垃圾桶:WemosD1 LOOP循环
    • 恩智浦智能车: stm32

带操作系统的:

  • X86,Intel windows

    • 启动过程: 电源 -》 BIOS -》windows内核-》C,D盘-》 程序启动(QQ)
  • 嵌入式产品: 树莓派,mini2440, mini6410,nanopi,海思,RK(瑞芯微)

    • 启动过程: 电源-》BootLoader(引导操作系统启动)-》Linux内核-》文件系统(根据功能性来组织文件夹,带访问权限)-》KTV点歌机
    • 文件系统在根目录下,dev放设备,lib放库,proc内核相关信息,home是用户登录的工作界面,sbin可执行文件或指令,bin可执行文件或指令,boot启动时候的相关数据
    • 交叉编译的原因:只有存在linux系统才能编译文件,但是启动前还没有bootloader、linux内核、以及文件系统,所以需要使用交叉编译让bootloader、linux内核等可以为树莓派所使用
  • 安卓:

    • 启动过程: 电源-》 fastBoot/Bootloader/-》linux内核-》文件系统-》虚拟机(跑java代码)-》HOME应用程序-》点某图标打开某APP

BootLoader的工作流程:

  • 一阶段: 让CPU 跟内存,FLASH, 串口,IIC,IIS, 数据段,打交道,驱动这些设备(汇编和C结合)
  • 二阶段: 引导Linux内核启动 (纯C)

树莓派Linux源码目录树分析

可以查看Linux操作系统基础文章下的【Linux 系统目录】

树莓派Linux源码配置

Linux源码特点:

  • Linux是开源,免费,LInux开源社区工作者共同维护,爱好
  • Linux是一个开源的,支持多架构多平台代码,可移植性非常高
  • Linux内核代码非常多,但是Linux内核编译出来一般就几M
    • 因为支持多平台(arm、mips、powerpc、x86等),多架构,所以编译之前要配置,配置成适合的目标平台来用

为什么要对Linux内核进行配置?

  • 因为从事驱动代码的编写时,驱动代码的编译需要一个提前编译好的内核,而编译内核就必须配置,将有用的文件编译出来,内核配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核【适用于某个平台的内核】

如何对Linux内核进行配置?

  • 第一种方式:
    • 厂家给相应平台的linux内核源码,比如说买了树莓派,给树莓派linux内核源码
    • cp 厂家.config .config
      • 第一章将树莓派4.14版本的linux内核源码已经放到ubuntu中,在unbuntu的树莓派源文件夹中执行如下命令找到配置文件
      • find . -name *_defconfig
      • 查找到./arch/arm/configs/bcm2709_defconfig【树莓派3使用的配置文件】
      • 参考下面案例的方式一进行配置
  • 第二种方式:
    • make menuconfig 一项项配置,通常是基于厂家的config来配置
    • 参考下面案例的方式二进行配置
  • 第三种方式:
    • 完全自己来

注意:
linux源码中有很多工程:

  • 树莓派1的工程是bcmrpi_defconfig;
  • 树莓派2、3的工程是bcm2709_defconfig。

配置树莓派的Linux内核

参考博文:

树莓派-内核开发-说明 下载代码 编译 替换内核

前期工作:

  • 完成相应版本树莓派Linux内核源码上传到ubuntu
  • 完成交叉编译工具链的永久配置

方式一:
在源码目录下将厂家的config文件拷贝到本地

  • ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
    • 指定ARM架构为arm
    • CROSS_COMPILE指定编译器为arm-linux-gnueabihf
    • KERNEL=kernel7是树莓派的固定配置,是核心指令
    • 厂家的config文件的名称

方式二: 如果没什么改的就不用执行这一步

  • 执行ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig则是在本地config文件上进行配置
  • 可能需要安装:nurses libraries,执行
    • sudo apt-get install libncurses5-dev libncursesw5-dev
    • sudo apt-get install zlib1g:i386
    • sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
  • nurses是个界面,提供可视化配置
  • 自定义配置,一般只修改Device Drivers,修改设备驱动

驱动两种加载方式:

  • 编译进内核 , zImage包含了驱动
  • M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载

在这里插入图片描述

树莓派Linux内核编译

编译:

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

    • j4指定用多少电脑资源进行编译
    • zImage生成内核镜像
    • modules要生成驱动模块
    • dtbs生成配置文件
  • 编译成功后,通过ls指令看到源码树目录多了vmlinux【没有压缩】,失败则无此文件,目标zImage镜像arch/arm/boot底下

注意:

  • 报错:usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of ‘yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here collect2: error: ld returned 1 exit status
  • 解决方案:降低gcc版本为9并提高其优先级

打包zImage文件:

  • 在源码数目录下打包zImage成树莓派可用的xxx.img

  • 直接用linux源码包里的工具: ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

  • 在本目录生成一个kernel_new.img文件,这个文件就是要放到sd卡中的文件。

数据拷贝

  • 需要将U盘连接到虚拟机的位置而不是本机

    • 虚拟机-》可移动设备-》找到相应的U盘设备进行连接
  • sudo dmesg查看内核信息,当有设备接入的时候内核会打印信息,可以看到树莓派的sd卡有sdb1和sdb2两个分区【对应fat分区和ext4分区】

    • dmesg 是通过读取kernel中ring buffer的数据,然后将其打印到标准输出(standard output-也就是我们的终端界面进行打印).
  • 在当前用户下创建两个文件夹:

    • mkdir data1
    • mkdir data2
  • 挂载分区到U盘

    • sudo mount /dev/sdb1 data1 一个fat分区,是boot相关的内容,kernel的img
    • sudo mount /dev/sdb2 data2 一个是ext4分区,也就是系统的根目录分区。

在这里插入图片描述

  • 安装modules, 设备驱动文件: 也就是设置hdmi usb wifi io …

    • 进入到树莓派linux内核目录中执行sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install将ext4替换成data2的绝对路径

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

  • 安装更新 kernel.img 文件,在data1文件夹中,镜像名字是kernel7.img【其实就是执行第四步cp,但覆盖前先拷贝】

  • 更新之前先备份

    • cd /home/fangjiarong/data1
    • cp kernel7.img kernel7OLD.img
    • cd 树莓派Linux内核目录下,该目录下有kernel_new.img
    • 再把编译新生成的kernel_new.img拷贝到data1,起名kernel7.img
    • cp kernel_new.img /home/chenlc/data1/kernel7.img
  • 查看是否拷贝成功

    • md5sum kernel_new.img
    • md5sum /home/chenlc/data1/kernel7.img
  • 在树莓派Linux内核目录下安装配置文件

cp arch/arm/boot/dts/.dtb [fat]/
cp arch/arm/boot/dts/overlays/.dtb* [fat]/overlays/
cp arch/arm/boot/dts/overlays/README [fat]/overlays/

修改为下方
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/
  • 更新完成后把usb卡断开连接,避免占用串口,导致无法通过串口验证该系统是否可以登录,然后修改U盘镜像文件里面的cmdline.txt文件,将其修改为启动串口模式,而不是串口通信模式,插回树莓派即可开机
  • 开机后可以用 uname -r 命令查看kernel信息已经改变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派——配置Linux内核适合树莓派 的相关文章

  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • diff 文件仅比较每行的前 n 个字符

    我有2个文件 我们将它们称为 md5s1 txt 和 md5s2 txt 两者都包含a的输出 find type f print0 xargs 0 md5sum sort gt md5s txt 不同目录下的命令 许多文件被重命名 但内容保
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific

随机推荐

  • 微服务架构中不同微服务之间的接口调用

    假定系统管理微服务的实例名称为system 在系统管理中查询码表 api system codeTable queryDataDictionaryByDicCode 在自己的微服务中调用系统管理的查询码表接口写法如下 DataDiction
  • 初识OpenGL (-)VAO&VBO

    如何填充VBO 配置顶点属性指针以及如何把它们都储存到一个VAO里 step1 把颜色数据加进顶点数据中 eg 把颜色数据添加为3个float值至vertices数组 把三角形的三个角分别指定为红色 绿色和蓝色 float vertices
  • 批处理框架

    什么是批处理 在现代企业应用当中 面对复杂的业务以及海量的数据 除了通过庞杂的人机交互界面进行各种处理外 还有一类工作 不需要人工干预 只需要定期读入大批量数据 然后完成相应业务处理并进行归档 这类工作即为 批处理 为什么使用Spring
  • 数据分析和数据挖掘概述

    1 含义 数据挖掘 指从大量的数据中 通过统计学 人工智能 机器学习等方法 挖掘出未知的 且有价值的信息和知识的过程 数据分析 可分为广义的数据分析和狭义的数据分析 广义的数据分析就是包括狭义的数据分析和数据挖掘 而我们常说的数据分析指的是
  • 交叉编译工具的使用说明

    写在前面的话 由于已经学习了JZ2440V3开发板的裸机程序 想检验下学习成果 所以从今天开始把以前学的知识点在tiny4412开发板上面做个检验 裸机部分学习到把uboot移植完成就结束 然后 学习内核的驱动和其他子系统框架 言归正传 现
  • 阿里面试官:接口的幂等性怎么设计?

    一 什么是幂等 看一下维基百科怎么说的 幂等性 多次调用方法或者接口不会改变业务状态 可以保证重复调用的结果和单次调用的结果一致 二 使用幂等的场景 1 前端重复提交 用户注册 用户创建商品等操作 前端都会提交一些数据给后台服务 后台需要根
  • linux shell 正则表达式(BREs,EREs,PREs)差异比较

    http www cnblogs com chengmo archive 2010 10 10 1847287 html 正则表达式 在计算机科学中 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串 在很多文本编辑器或其他
  • 笛卡尔树建树

    拿个单调队列维护 最后pop出来的就是它的左儿子 现在还在的 它是他的右儿子 int build int S N for int i 1 i lt n i while top T S top val lt T i val T i son 0
  • Markdown中显示矩阵运算过程

    发现这个神奇的用法 以后写博客就可以很好的演示矩阵乘法了 原文知乎 这里再分享一个可以把latex转成图片的在线网站quicklatex markdown 显示矩阵 from IPython display import display L
  • mysql锁总结

    参考文章 MySQL 死锁查询 事务与锁详解2 MySQL死锁系列 常见加锁场景分析 死锁的成因 场景以及死锁的避免 查询锁sql 1 查看当前的事务 SELECT FROM INFORMATION SCHEMA INNODB TRX 2
  • 解决centos下sudo运行tshark,写入文件显示:Permission denied.

    在 w时 需要把文件名写全 相对路径无权限 则需要写成绝对路径 比如 sudo tshark w home xxxx mypcap pcap 下面的不行 sudo tshark w mypcap pcap Permission denied
  • 走线和交互式布线_画PCB时,一些非常好的布线技巧

    画PCB时 一些非常好的布线技巧 布线是PCB设计过程中技巧最细 限定最高的 即使布了十几年布线的工程师也往往觉得自己不会布线 因为看到了形形色色的问题 知道了这根线布了出去就会导致什么恶果 所以 就变的不知道怎么布了 但是高手还是有的 他
  • spring cloud 2021.0.1升级踩坑记录

    一 版本说明 升级前的版本 spring boot 2 2 2 RELEASE spring cloud Hoxton SR1 spring cloud alibaba 2 2 0 RELEASE 升级后版本 spring boot 2 6
  • linux测试代码段运行时间,如何精确测量一段代码的执行时间

    原标题 如何精确测量一段代码的执行时间 本文转载自西邮Linux兴趣小组 最近在工作中遇到了需要精确测量一段C代码执行时间的需求 这里有三种方案供大家选择 1 gettimeofday 2 2 rdtsc rdtscp 3 clock ge
  • 工程师的自我修养:全英文技术学习实践

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 引子 2016年9月 上海GOPS大会现场 Site Reliability Engineering 一书的作者之一 来自Google的Chris Jones在做分享 Ch
  • linux内核添加模块,linux中添加内核模块

    1 内核模块简介 Linux 内核的 整 体结构 非 常 庞 大 其 包 含 的 组 件也 非 常多 如 何使用 需 要 的 组 件 呢 方 法 一 把 所有的 组 件都 编译 进 内核 文 件 即 zImage 或bzImage 但 这样
  • 【MYSQL基础】SQL-DML(数据操作语言)

    文章目录 一 DML 介绍 二 DML 语法 2 1DML 添加 插入数据 2 2DML 修改 更新数据 2 3DML 删除数据 一 DML 介绍 DML Data Manipulation Language 数据操作语言 用来对数据库中表
  • 华夏大盘精选基金经理王亚伟:08年做不好会赔钱

    编者按 华夏基金投资决策委员会主席 华夏大盘精选基金经理王亚伟在华夏基金08年投资策略报告会上对明年资本市场的走势发表了自己的看法 王亚伟 尊敬的各位领导 各位来宾 下午好 刚才两位名嘴很精彩 现在基金行业总体来说是越来越娱乐化了 基金经理
  • 12. XPath解析入门

    目录 前言 模块安装 XPath涉及的基本概念 XPath基本语法 测试完整代码 XPath进阶用法 需求1 让xpath处理这个资源文件 需求2 找到标签位置 如html标签 需求3 找到无序列表 ul 中每一项 li 包裹的文本内容 需
  • 树莓派——配置Linux内核适合树莓派

    文章目录 将linux内核代码和编译工具tools上传到ubuntu 树莓派等芯片带操作系统的启动过程 不带操作系统的 带操作系统的 BootLoader的工作流程 树莓派Linux源码目录树分析 树莓派Linux源码配置 Linux源码特