嵌入式知识点总结 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过来,导致数据预取异常

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM对象分配内存如何保证线程安全?

大家好&#xff0c;我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助&#xff1b; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;对象的内存分配是通过堆内存进行的。…

利用飞书机器人进行 - ArXiv自动化检索推荐

相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册&#xff0c;新建自定义机器人&#xff0c;并记录好webhook地址&#xff0c;后续将在配置文件中更新该地址。 可以先完成到后续步骤之前&#xff0c;后续的步骤与安全相关&…

OpenCV:在图像中添加噪声(瑞利、伽马、脉冲、泊松)

目录 简述 1. 瑞利噪声 2. 伽马噪声 3. 脉冲噪声 4. 泊松噪声 总结 相关阅读 OpenCV&#xff1a;在图像中添加高斯噪声、胡椒噪声-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&…

github制作静态网页

打开gihub并新建仓库 命名仓库&#xff1a;xxx.github.io 点击create repository进行创建 点击蓝色字体“creating a new file”创建文件 文件命名为index.html, 并编写html 右上角提交 找到setttings/pages&#xff0c;修改路径&#xff0c;点击保存&#xff0c;等…

从 SAP 功能顾问到解决方案架构师:破茧成蝶之路

目录 行业瞭望&#xff1a;架构师崭露头角 现状剖析&#xff1a;功能顾问的局限与机遇 能力跃迁&#xff1a;转型的核心要素 &#xff08;一&#xff09;专业深度的掘进 &#xff08;二&#xff09;集成能力的拓展 &#xff08;三&#xff09;知识广度的延伸 &#xff0…

unity学习23:场景scene相关,场景信息,场景跳转

目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景&#xff0c;在构建中包含的场景 &#xff08;否则会认为是失效的Scene&#xff09; 2.4 Scenes in Bui…

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景 2025.1.29 蛇年快乐&#xff01; 接之前wiki 35、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;五&#xff09; 已经分析完了第一个测试项&#xff0c;输入输出端口测试&#xff0c;接下来分析下环境变量测试&#xff0c;也比较…

使用Ollama本地部署DeepSeek R1

前言 DeepSeek是一款开源的智能搜索引擎&#xff0c;能够通过深度学习技术提高搜索的智能化水平。如果你正在寻找一种方式来将DeepSeek部署在本地环境中&#xff0c;Ollama是一个非常方便的工具&#xff0c;它允许你在本地快速部署并管理各种基于AI的模型。 在本篇博客中&…

libOnvif通过组播不能发现相机

使用libOnvif库OnvifDiscoveryClient类&#xff0c; auto discovery new OnvifDiscoveryClient(QUrl(“soap.udp://239.255.255.250:3702”), cb.Build()); 会有错误&#xff1a; end of file or no input: message transfer interrupted or timed out(30 sec max recv delay)…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手&#xff0c;可帮助你更快、更省力地编写代码&#xff0c;从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能&#xff1f; 每月 2000 代码补全&#xff0c;帮助开发者快速完成代码编写。 每月 …

HTB:Forest[WriteUP]

连接至HTB服务器并启动靶机 分配IP&#xff1a;10.10.16.21 靶机IP&#xff1a;10.10.10.161 靶机Domain&#xff1a;forest.htb 目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意&#xff1a;GateWay不能跟Web一起引入&#xff01; 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…

STM32 PWM驱动直流电机

接线图&#xff1a; 代码配置&#xff1a; 根据驱动舵机的代码来写&#xff0c;与舵机不同的是&#xff0c;这次的引脚接到了PA2上&#xff0c;所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚&#xff0c;来控制电机的旋转方向&#xff0c;这里连接到了PA4与…

强大到工业层面的软件

电脑数据删不干净&#xff0c;简直是一种让人抓狂的折磨&#xff01;明明已经把文件扔进了回收站&#xff0c;清空了&#xff0c;可那些残留的数据就像牛皮癣一样&#xff0c;怎么也除不掉。这种烦恼简直无处不在&#xff0c;让人从头到脚都感到无比烦躁。 首先&#xff0c;心…

一分钟搭建promehteus+grafana+alertmanager监控平台

为什么要自己搭建一个监控平台 平时进行后端开发&#xff0c;特别是微服务的后端可开发&#xff0c;一定少不了对接监控平台&#xff0c;但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试&#xff0c;这里我使用docker-compose搭建了一个…

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机&#xff08;基于 STM32CubeIDE GCC 开发&#xff09;&#xff0c;它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的&#xff0c;缺点是不支持…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

崇州市街子古镇正月初一繁华剪影

今天是蛇年正月初一&#xff0c;下午笔者步出家门&#xff0c;逛到了崇州市街子古镇井水街&#xff0c;想看看景象如何。结果看到的是车水马龙、人流如织&#xff0c;繁花似锦&#xff0c;热闹非凡&#xff0c;原来今天开始预订此地摆下的长街宴。心里高兴&#xff0c;便用手机…

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型&#xff0c;以便根据输入特征预测目标变量&#xff0c;在使用 TensorFlow 2.x 实现线性回归模型时&…