当前位置: 首页 > news >正文

Linux系统移植之Uboot启动流程

Linux系统移植之Uboot启动流程

  • 一,Uboot启动流程
    • 1.Uboot的两阶段
      • 1.1.第一阶段
        • 1.11.硬件初始化
        • 1.12.复制 U-Boot 到 RAM
        • 1.13.跳转到第二阶段
      • 1.2.第二阶段
        • 1.21.C 语言环境初始化
        • 1.22. 硬件设备初始化
        • 1.23. 加载环境变量
        • 1.24. 显示启动信息
        • 1.25. 等待用户输入(可选)
        • 1.26. 加载内核并启动
  • 二,相关文件
    • 1.u-boot.lds
    • 2.BSS段

一,Uboot启动流程

1.Uboot的两阶段

第一阶段初始化硬件,采用的汇编语言。
第二阶段更为复杂的初始化和内核加载,采用C语言。

1.1.第一阶段

uboot启动,先找到入口(第一行程序),通过链接脚本u-boot.lds找到程序的入口地址,即文件中的_start,如下:
在这里插入图片描述
在这里插入图片描述

1.11.硬件初始化
  • 关中断:在启动过程中,为了避免中断干扰初始化流程,首先会关闭所有中断。例如,在 ARM 架构中,通过设置 CPSR(当前程序状态寄存器)的相应位来禁止 IRQ(外部中断请求)和 FIQ(快速中断请求)。比如在_start的54行,跳转到reset函数中,reset函数会设置CPU处于SVC2模式,并且关闭FIQ和IRQ中断,用的是汇编语言。
  • 初始化时钟:配置系统时钟,确保各个硬件模块能够以正确的频率运行。这可能涉及到设置 PLL(锁相环)等时钟源,以提供稳定的时钟信号。
  • 初始化存储控制器:对内存控制器、Flash 控制器等进行初始化,以便后续能够正确访问内存和存储设备。例如,设置内存的时序参数、片选信号等。
  • 初始化栈指针:为后续执行 C 代码准备栈空间,设置栈指针(SP)指向合适的内存地址。
1.12.复制 U-Boot 到 RAM

由于 Flash 等存储设备的读写速度较慢,为了提高程序的执行效率,通常会将 U-Boot 的第二阶段代码从 Flash 复制到 RAM 中执行。复制的起始地址和长度需要根据具体的硬件和 U-Boot 配置来确定。

1.13.跳转到第二阶段

在完成硬件初始化和代码复制后,程序会跳转到 U-Boot 第二阶段的入口点,开始执行 C 代码。

1.2.第二阶段

1.21.C 语言环境初始化
  • 初始化全局变量:对 C 语言中的全局变量进行初始化,确保它们具有正确的初始值。
  • 初始化堆:为动态内存分配(如 malloc 函数)初始化堆空间。
1.22. 硬件设备初始化
  • 初始化串口:配置串口通信参数,以便在启动过程中可以通过串口输出调试信息,方便开发人员进行调试和监控。
  • 初始化网络设备:如果系统支持网络功能,会对网络设备进行初始化,包括设置 MAC 地址、配置网络接口等。
  • 初始化其他设备:根据具体的硬件平台和应用需求,还可能对其他设备进行初始化,如 USB 设备、LCD 显示屏等。
1.23. 加载环境变量

U-Boot 支持环境变量的功能,这些环境变量可以用于配置 U-Boot 的行为和内核的启动参数。在启动过程中,U-Boot 会从存储设备(如 Flash)中加载预先保存的环境变量。

1.24. 显示启动信息

通过串口或其他输出设备,显示 U-Boot 的版本信息、硬件平台信息等启动信息,让用户了解系统的基本情况。

1.25. 等待用户输入(可选)

在某些情况下,U-Boot 会在启动过程中等待用户输入。例如,用户可以按下特定的按键进入 U-Boot 的命令行界面,进行一些手动配置和操作。

1.26. 加载内核并启动

根据环境变量中配置的内核加载地址和方式,U-Boot 会从存储设备(如 SD 卡、NAND Flash 等)或网络中加载操作系统内核到内存中。
U-Boot 会将一些必要的参数(如内核命令行参数、设备树等)传递给内核,并跳转到内核的入口点,将控制权交给内核,从而启动操作系统。bootz命令执行do_bootz函数,设置linux系统在DRAM中的存储位置0x80800000,设备树在DRAM中的存储地址0x83000000,最终由do_bootm_linux启动linux内核参数,起始地址保存linux内核第一行代码(汇编),就是函数kernel_entry(内核入口点),这个函数有三个参数,zero,arch,params,第一个参数zero为0,第二个参数为机器ID,第三个用于传递设备树。
在这里插入图片描述

二,相关文件

1.u-boot.lds

u-boot.lds即链接脚本:指导链接器如何进行内存分配和符号解析的文件。在uboot程序编译和链接时,编译器将代码源文件编译成.o的目标文件,这些文件包含了代码和数据,但是其地址是相对的,链接器就是将多个目标文件合并成一个可执行文件,为代码段,数据段和bss段分配实际的内存地址,链接脚本就是对其进行指导。

2.BSS段

程序内用于存放未初始化的全局变量和静态变量的一段区域。在编译器编译和链接过程中,将程序的不同部分分到不同段中,对于BSS段部分的内容,执行前会初始化为0(数据)活着空指针,好处就是节省执行文件的空间。具体生成这个BSS段:编译器在编译源文件时,会识别未初始化的全局变量和静态变量,将其标记为BSS类型,编译多个文件,会将所有BSS类型的变量合并到一个BSS段中,记录该段的起始地址和大小。

相关文章:

Linux系统移植之Uboot启动流程

Linux系统移植之Uboot启动流程 一,Uboot启动流程1.Uboot的两阶段1.1.第一阶段1.11.硬件初始化1.12.复制 U-Boot 到 RAM1.13.跳转到第二阶段 1.2.第二阶段1.21.C 语言环境初始化1.22. 硬件设备初始化1.23. 加载环境变量1.24. 显示启动信息1.25. 等待用户输入&#xf…...

【Open X-Embodiment】简单数据下载与预处理

文章目录 1. RLDS Dataset2. 处理成numpy格式3. 存储桶 1. RLDS Dataset 从 Octo 里面找到数据下载的代码 rlds_dataset_mod github 按照官网代码配置环境后,修改 prepare_open_x.sh,相当于只用 gsutil 下载数据: DOWNLOAD_DIR/mnt/data…...

【第四节】C++设计模式(创建型模式)-Builder(建造者)模式

目录 引言 一、Builder 模式概述 二、Builder 模式举例 三、Builder 模式的结构 四、Builder 模式的实现 五、Builder 模式的优缺点 六、总结 引言 Builder 模式是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离。通过一步步构建对象,…...

排查JVM的一些命令

查看JVM相关信息的方法 环境&#xff1a; Win10, jdk17 查看端口的Pid netstat -ano | findstr <端口号>列出当前运行的JVM进程 ## 用于输出JVM中运行的进程状态信息。通过jps&#xff0c;可以快速获取Java进程的PID&#xff08;进程标识符&#xff09;&#xff0c; …...

uni-app(位置1)

文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…...

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…...

登录-05.JWT令牌-介绍

一.JWT令牌 JWT令牌是一种简洁的、自包含的格式&#xff0c;用于在通讯双方之间以json数据格式安全的传输数据。说白了&#xff0c;JWT令牌就是将json格式的数据进行封装&#xff0c;从而实现安全传输。 所谓简洁&#xff0c;就是指JWT令牌就是一个简单的字符串。 所谓自包含…...

Mac下Python版本管理,适用于pyenv不起作用的情况

前言 声明&#xff1a;之前也在网上看到过可以使用pyenv来管理python版本&#xff0c;但由于作者的python安装路径实在是繁杂不堪&#xff0c;因此安装完成pyenv体验下来没有任何用处&#xff0c;但偶然发现vscode似乎可以看到各个python版本&#xff0c;因此写下这篇博客记录…...

Ubuntu 服务器Llama Factory 搭建DeepSeek-R1微调训练环境

1.首先了解一下什么是LLM微调 LLM 微调指的是在已经预训练好的大型语言模型基础上&#xff0c;使用特定的任务数据或领域数据&#xff0c;通过进一步的训练来调整模型的参数&#xff0c;使其在特定任务或领域上能够表现得更好。简单来说&#xff0c;就是对一个已经具备了丰富语…...

【redis】redis内存管理,过期策略与淘汰策略

一&#xff1a;Redis 的过期删除策略及处理流程如下&#xff1a; 1. 过期删除策略 Redis 通过以下两种策略删除过期键&#xff1a; 1.1 惰性删除 触发时机&#xff1a;当客户端访问某个键时&#xff0c;Redis 会检查该键是否过期。执行流程&#xff1a; 客户端请求访问键。…...

RabbitMQ学习—day6—死信队列与延迟队列

目录 死信队列 1. 死信的概念 2. 死信的来源 实战演练 1. 消息TTL过期 2. 队列达到最大长度 3. 消息被拒绝 延迟队列 概念 使用场景 TTL的两种设置 死信队列 1. 死信的概念 1.1 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的…...

seacmsv9联合注入数据以及绕过 ORDERBY

seacmsv9联合注入数据 php源码 <?php session_start(); require_once("../../include/common.php"); $id (isset($gid) && is_numeric($gid)) ? $gid : 0; $page (isset($page) && is_numeric($page)) ? $page : 1; $type (isset($type) …...

day58 第十一章:图论part08

拓扑排序精讲 关键&#xff1a; 先找到入度为0的节点&#xff0c;把这些节点加入队列/结果&#xff0c;然后依次循环再找。 #include <iostream> #include <vector> #include <queue> #include <unordered_map> using namespace std; int main() {int …...

网络安全-openssl工具

OpenSSl是一个开源项目&#xff0c;包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准&#xff0c;并且拥有比较长的历史&#xff0c;现在几乎所有的服务器软件和很多客户端都在使用openssl&#xff0c;其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…...

Java面试第六山!《MySQL基础知识点》

一、引言 MySQL 作为一款广泛使用的开源关系型数据库管理系统&#xff0c;在软件开发领域占据着重要地位。无论是小型项目还是大型企业级应用&#xff0c;都能看到 MySQL 的身影。今天就来和大家分享 MySQL 的相关知识&#xff0c;帮助大家更好地应对日常开发和面试。 二、My…...

云计算中的API网关是什么?为什么它很重要?

在云计算架构中&#xff0c;API网关&#xff08;API Gateway&#xff09;是一个重要的组件&#xff0c;主要用于管理、保护和优化不同服务之间的接口&#xff08;API&#xff09;通信。简单来说&#xff0c;API网关就像是一个中介&#xff0c;它充当客户端和后端服务之间的“桥…...

【WebGL】fbo双pass案例

双pass渲染案例&#xff08;离线渲染一个三角面&#xff0c;然后渲染到一个占满屏幕的矩阵上&#xff09; 离线渲染如何需要开启深度测试的话&#xff0c;需要额外操作&#xff0c;这里不展开 <!DOCTYPE html> <html lang"en"><head><meta ch…...

Unity面板介绍_层级面板(23.1.1)

一、Inspector(检视面板) 显示当前选定游戏对象附加的组件及其属性信息。为重要游戏物体选择图标 二、面板详情...

详解Nginx 配置

一、Nginx 介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发&#xff0c;自 2004 年发布以来&#xff0c;凭借其高性能、低内存消耗、高并发处理能力等特点&#xf…...

数据库系统概念

1. 绪论 数据库的基本概念: 数据(data): 数据库中存储的基本对象, 可以是文字, 声音, 图片, 视频等。 数据库(DB): 概括来说就是永久存储, 有组织, 可共享的大量数据的集合。 数据库管理系统(DBMS): 和操作系统一样是计算机基础软件, 主要有数据定义语言(DDL, 对数据对象的组…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...