Linux-ubuntu系统移植之Uboot启动流程

news/2025/2/21 20:37:28/

Linux-ubuntu系统移植之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段中,记录该段的起始地址和大小。


http://www.ppmy.cn/news/1573975.html

相关文章

详解Nginx 配置

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

openharmony中hdf框架的设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别

设备节点(HdfDeviceNode)和设备实例(HdfDevice)的区别 在 OpenHarmony 驱动框架 HDF 中,设备节点(HdfDeviceNode) 和 设备实例(HdfDevice) 是两个重要的概念&#xff0c…

整合Salesmart/WhatsApp、开源Odoo模块和Deepseek AI能力,实现针对国外客户的智能客服和个性化推荐服务

一、项目背景 本文提出了一套针对软管制造公司的智能客服与个性化推荐系统实施方案,旨在通过整合开源Odoo模块、Salesmart/WhatsApp以及Deepseek AI能力,打造一个724小时不间断服务的智能化平台,专注于服务国外客户。方案围绕实现不间断服务…

python游戏库入门:ursina游戏引擎——复原《我的世界》

目录 : 主要特性 依赖库: 第一个 ursina代码: 创建一个物体: 代码解读: 复原《我的世界》: 总结 Ursina 是一个用于创建 3D 游戏和应用程序的 Python 游戏引擎。它基于 Panda3D 引擎构建&#xff0c…

ARM Linux平台下 OpenCV Camera 实验

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器,支持以下功能: 最高分辨率:200 万像素(1600x1200)。 输出格式:JPEG、YUV、RGB。 内置图像处理功能:自动曝…

Java Swing 学习笔记

一、什么是Swing swing是一个比较老的技术了,我觉得学习它还是很有必要的,也比较容易激发学习的兴趣。 Swing 是构建在 AWT(Abstract Window Toolkit)之上的轻量级 GUI 工具包,用于创建跨平台的图形用户界面。与 AWT…

老游戏回顾:SOR

被称为QTE之子,销量约130w。CE引擎打造,画面精美。 以罗马帝国为背景的一款动作游戏,游戏中玩家将化身罗马将领马略提图斯(Marius Titus),为了替家族的死亡复仇而投身军旅,率领罗马战士展开一场…

火绒V6.0小工具提取版——无需安装,一键解锁实用功能!

在国内众多杀毒软件中,火绒无疑是口碑最佳的存在。它完全免费,无需登录,没有会员限制,也没有恼人的弹窗广告,使用体验直接“吊打”某些知名收费杀毒软件。即便火绒如此好用,仍有不少朋友选择“裸奔”。毕竟…