嵌入式知识点总结 Linux驱动 (二)-uboot bootloader

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。

目录

1.什么是bootloader?

2.Bootloader的两个阶段

3.uboot启动过程中做了哪些事?

4.uboot和内核kernel如何完成参数传递?

5.为什么要给内核传递参数?

6.如何给内核传递参数?

7.为什么uboot要关掉caches?


1.什么是bootloader?

Linux系统要启动就必须需要一个 bootloader程序,也就说芯片上电以后先运行一段bootloader程序这段 bootloader程序会先初始化时钟,看门狗,中断,SDRAM,等外设,然后将 Linux内核从flash(NAND,NOR FLASH,SD,MMC等)拷贝到SDRAM中,最后启动Linux内核。当然了bootloader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux内核。
bootloader和 Linux内核的关系就跟PC上的BIOS和 Windows的关系一样,bootloader就相当于BIOS。总得来说,Bootloader就是一小段程序,它在系统上电时开始执行,初始化硬件设各、准备好软件环境,最后调用操作系统内核。

loader包含ATF UBOOT (设备树)FDT
对于复杂系统系统启动流程一般是:BootRom、Bootloader、Kernel、Filesystem(文件系统)、App
BootLoader的主要功能包括:关闭看门狗,初始化中断和异常向量表,进行时钟和外设的初始化,提供Can、Uart、Flash读写驱动等等。 大多数的Bootloader分为两个阶段,第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化并调用第二阶段的代码;第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。 SPL(Secondary Program Loader)。硬件设备初始化、初始化内存空间、初始化堆栈,随后将第二阶段的代码(uboot)复制到SRAM中,跳转到Uboot入口地址处Uboot第二阶段初始化本阶段要使用到的硬件设备,通常会初始化一个串口做命令行方便交互。随后可能检测系统内存映射(memory map),并将内核代码复制到DDR中,最后准备传递给内核的参数,并引导内核

2.Bootloader的两个阶段

(1)Bootloader第一阶段的功能 硬件设备初始化 为加载Bootloader 的第二阶段代码准备RAM空间 复制 Bootloader 的第二阶段代码到RAM空间中 设置好栈 跳转到第二阶段代码的C入口点
(2)Bootloader第二阶段的功能 初始化本阶段要使用到的硬件设备(如串口、Flash和网卡等) 检测系统内存映射( memory map ) 将内核映象和根文件系统映象从Flash 上读到RAM空间中 ·为内核设置启动参数 调用内核

3.uboot启动过程中做了哪些事?

硬件上电或复位。

执行 SPL(若存在),初始化基本硬件。

加载主 U-Boot 到 RAM 并执行。

初始化硬件和外设。

加载环境变量。

检测和选择启动设备。

加载内核和根文件系统。

跳转到内核,完成启动过程。

4.uboot和内核kernel如何完成参数传递?

U-Boot和Linux内核之间的参数传递通常通过环境变量设备树来实现。以下是几种常见的参数传递方式:

1. 通过 U-Boot 环境变量传递参数

U-Boot 提供了一个环境变量机制,可以在启动时将一些参数传递给内核。这些环境变量通常用于传递系统配置、启动选项等。

在 U-Boot 中设置环境变量:

setenv bootargs "root=/dev/mmcblk0p2 console=ttyS0,115200"
saveenv

在启动内核时,U-Boot 会将这些环境变量传递给内核,通常是通过 bootargs 参数。内核启动时可以通过 bootargs 来获取启动时传递的参数。

U-Boot 中的环境变量可以通过 printenv 命令查看,修改后使用 saveenv 保存。

内核启动时,会通过 bootargs 参数接收到这些传递的参数。内核可以通过 getenv()parse_bootargs() 函数来解析这些参数。

2. 通过设备树传递参数

设备树(Device Tree,DT)是一种硬件描述的标准格式,内核在启动时会加载设备树以获取硬件配置信息。你也可以通过设备树来传递一些启动时的配置参数。

在设备树文件中,你可以定义一个 chosen 节点,用于传递启动参数。例如:

/ {chosen {bootargs = "console=ttyS0,115200 root=/dev/mmcblk0p2";};
};

在内核启动时,内核会解析设备树中的 bootargs 参数,通常它会覆盖 U-Boot 传递的 bootargs 环境变量,或者可以与之合并。

设备树中的参数可以通过 of_get_flat_dt_prop()of_get_property() 函数读取。在内核代码中,通常会在初始化阶段读取这些信息。

有时,我们还会用到 U-Boot 的 bootcmd 命令来启动内核,这时可以在命令行中指定内核参数。

例如,在 U-Boot 中通过以下命令启动内核:

run bootcmd

bootcmd 脚本中,你可以设置 bootargs,然后使用 bootmbootz 等命令启动内核。

5.为什么要给内核传递参数?

在此之前,uboot已经完成了硬件的初始化,可以说已经"适应了“这块开发板。然而,内核并不是对于所有的开发板都能完美适配的(如果适配了,可想而知这个内核有多庞大,又或者有新技术发明了,可以完美的适配各种开发板),此时,对于开发板的环境一无所知。所以,要想启动Linux内核,uboot必须要给内核传递一些必要的信息来告诉内核当前所处的环境

给内核传递参数是为了在系统启动时调整内核的行为或配置运行环境。这些参数会影响内核的初始化过程、硬件配置和功能启用。

参数作用
console=ttyS0,115200指定串口为控制台,设置波特率为 115200。
root=/dev/mmcblk0p1指定根文件系统所在设备。
rootfstype=ext4指定根文件系统的类型为 ext4。
quiet禁止内核启动时打印日志信息。
loglevel=7设置内核日志打印的详细级别。
mem=512M限制可用内存为 512 MB。
nohz=on启用动态时钟。
maxcpus=1限制系统只使用一个 CPU 核心。
panic=10系统崩溃后 10 秒重启。

6.如何给内核传递参数?

U-Boot 是嵌入式系统的常用引导加载程序,它支持通过环境变量传递参数给内核,特别是 bootargs 变量。

设置环境变量: 在 U-Boot 提示符下,设置 bootargs 环境变量,这个变量通常包含内核启动时的参数。

setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw"

保存环境变量: 设置完成后,使用 saveenv 命令保存这些环境变量:

saveenv

启动内核: 启动内核时,U-Boot 会将 bootargs 环境变量传递给内核。例如,可以使用 bootmbootz 命令启动内核:

bootm 0x80008000

内核获取参数: 内核会从 U-Boot 传递过来的 bootargs 中读取启动参数。内核启动时会将这些参数存储在 boot_args 中,你可以在内核代码中通过 getenv()parse_bootargs() 等函数解析这些参数。

如果你在 U-Boot 中设置了 bootargs="console=ttyS0,115200 root=/dev/mmcblk0p2",内核启动时就会使用这些参数进行初始化,例如设置串口终端(console)和挂载根文件系统(root=/dev/mmcblk0p2)。

2. 通过设备树传递参数

设备树(Device Tree,DT)是描述硬件的一种标准方式,内核会读取设备树来配置硬件资源。有时你也可以在设备树中指定一些参数,尤其是与硬件配置相关的启动参数。

3. 通过内核启动命令行参数

有时,启动命令本身也可以直接在启动脚本中传递给内核。例如,如果你的引导加载器(如 GRUB)支持,你可以直接在启动命令中指定内核启动参数。

在启动命令中指定参数: 在引导加载器的配置文件中(如 GRUB 的 grub.cfg),你可以为内核指定启动参数:

linux /vmlinuz-5.10.0 root=/dev/sda1 console=ttyS0,115200

内核获取参数: 内核启动时会从引导加载器传递的命令行中获取这些参数。

4. 通过内核命令行

内核启动时,通常会使用命令行参数(bootargs)。这些参数在内核启动时由引导加载器(如 U-Boot、GRUB 等)传递。内核可以通过 command_line 全局变量或 getopt() 函数解析这些参数。

常用的内核命令行参数:

  • root=<root_device>:指定根文件系统。
  • console=<console_device>:指定控制台设备。
  • mem=<size>:指定内存大小。
  • debug:启用调试模式。

7.为什么uboot要关掉caches?

caches是cpu内部的一个2级缓存,它的作用是将常用的数据和指令放在cpu内部。caches是通过CP15管理的,刚上电的时候,cpu还不能管理caches。上电的时候指令cache可关闭,也可不关闭,但数据cache一定要关闭,否则可能导致刚开始的代码里面,去取数据的时候,从cache里面取,而这时候RAM中数据还没有caches过来,导致数据预取异常

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

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

相关文章

Unbutu虚拟机+eclipse+CDT编译调试环境搭建

问题1: 安装CDT&#xff0c;直接Help->eclipse Market space-> 搜cdt , install&#xff0c;等待重启即可. 问题2&#xff1a;C变量不识别vector ’could not be resolved 这是库的头文件没加好&#xff0c;右键Properties->C Build->Enviroment&#xff0c;增加…

碳化硅MOSFET相对IGBT和超结MOSFET出现价格倒挂预示着什么

碳化硅&#xff08;SiC&#xff09;MOSFET相对于IGBT和超结MOSFET出现价格倒挂&#xff08;即SiC MOSFET单价低于传统硅基器件&#xff09;&#xff0c;这一现象反映了化合物半导体产业的深刻变革&#xff0c;并预示着技术、市场和产业链格局的多重演变。倾佳电子杨茜从技术突破…

openRv1126 AI算法部署实战之——TensorFlow TFLite Pytorch ONNX等模型转换实战

Conda简介 查看当前系统的环境列表 conda env list base为基础环境 py3.6-rknn-1.7.3为模型转换环境&#xff0c;rknn-toolkit版本V1.7.3&#xff0c;python版本3.6 py3.6-tensorflow-2.5.0为tensorflow模型训练环境&#xff0c;tensorflow版本2.5.0&#xff0c;python版本…

LabVIEW无线齿轮监测系统

本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机&#xff0c;实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件&#xff0c;可以实现对齿轮箱振动信号的采集、传输和故障识别&#xff0c;集远程采集、数据库存储…

SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue&#xff08;前端&#xff09;axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…

jQuery小游戏(一)

jQuery小游戏&#xff08;一&#xff09; 嘻嘻&#xff0c;今天我们来写个jquery小游戏吧 首先&#xff0c;我们准备一下写小游戏需要准备的佩饰&#xff0c;如果&#xff1a;图片、音乐、搞怪的小表情 这里我准备了一些游戏中需要涉及到的图片 游戏中使用到的方法 eval() 函…

H3CNE-28-VRRP

虚拟网关冗余协议&#xff0c;Virtual Router Redundancy Protocotol 三层网关冗余技术对用户网关做冗余 VRRP配置示例 接口IP配置&#xff0c;略。 R1&#xff1a; int g0/0vrrp vrid 1 virtual 192.168.1.254vrrp vrid 1 priority 105 # 1-254,越大越优先R2&#xff1a; …

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 官方说明书 https://support.hyland.com/r/Alfresco/Alfresco-Content-Services-Community-Edition/23.4/Alfresco-Content-Services-Community-Edition/Using/Content/Folder-rules/Defining-…

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先&#xff0c;它是保障网络安全的关键防线&#xff0c;通过设置访问控制规则&#xff0c;可精准过滤非法网络流量&#xff0c;有效阻挡外部黑客攻击、恶…

Midjourney基础-常用修饰词+权重的用法大全

用好修饰词很关键 Midjourney要用除了掌握好提示词的写法&#xff0c;按照上一篇《做Midjourney最好图文教程-提示词公式以及高级参数讲解》画面主体 场景氛围 主体行为 构图方式 艺术风格 图像质量。 要画出有质感的内容我们必须要掌握好“修饰词”&#xff0c;这些修饰…

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要&#xff0c;很多项目执行程序后出现报错信息无法第一时间收到&#xff0c;因此实时预警对于监控程序还是有必要。&#xff08;仅个人观点&#xff09; 参考文档及博客&#xff1a…

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …

大数据治理实战:架构、方法与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段&#xff0c;尤其在数据驱动决策和人工智能应用日益普及的背景下&…

【时时三省】(C语言基础)文件的随机读写

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例&#xff1a; 这个输出的就是ade seek&#xff3f;cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK&#xff3f;CUR…

yolov5错误更改与相关参数详解(train.py)

1.错误更改 main中相关参数 if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, default, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/yolov5s.yaml, helpmodel.yaml path)parser.add_arg…

第4章 基于中点电流的NPC逆变器中点电压平衡策略

1. 工作原理 1.1 NPC型三电平逆变器工作原理 NPC型三相三电平逆变器有A、B、C三个桥臂&#xff0c;其组成结构是相同的&#xff0c;本章以A相为例&#xff0c;对其工作原理进行分析。开关器件SA1和SA3、SA2和SA4为互补器件&#xff0c;通过控制开关器件的导通和关断状态&#…

【C++】内联函数inline、关键字auto与新式for

内联函数 内联函数背景 我们在使用C语言中我们都学过函数&#xff0c;我们知道函数在调用的过程中需要开辟栈帧。如果我们需要频繁的调用一个函数&#xff0c;假设我们调用10次Add()函数&#xff0c;那我们就需要建立10次栈帧。我们都知道在栈帧中要做很多事情&#xff0c;例如…

【深度学习】图像分类数据集

图像分类数据集 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transfo…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作

Retrieve 检索 示例 1. 构造数据 创建表结构 create table exam1(id bigint, name varchar(20) comment同学姓名, Chinesedecimal(3,1) comment 语文成绩, Math decimal(3,1) comment 数学成绩, English decimal(3,1) comment 英语成绩 ); 插入测试数据 insert into ex…