分页网站,制作一个app的完整流程,企业品牌网站建设注意事项,网址导航的优缺点Linux系统移植之Uboot启动流程 一#xff0c;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… 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. 等待用户输入可选1.26. 加载内核并启动 二相关文件1.u-boot.lds2.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,archparams,第一个参数zero为0第二个参数为机器ID第三个用于传递设备树。
二相关文件
1.u-boot.lds
u-boot.lds即链接脚本指导链接器如何进行内存分配和符号解析的文件。在uboot程序编译和链接时编译器将代码源文件编译成.o的目标文件这些文件包含了代码和数据但是其地址是相对的链接器就是将多个目标文件合并成一个可执行文件为代码段数据段和bss段分配实际的内存地址链接脚本就是对其进行指导。
2.BSS段
程序内用于存放未初始化的全局变量和静态变量的一段区域。在编译器编译和链接过程中将程序的不同部分分到不同段中对于BSS段部分的内容执行前会初始化为0数据活着空指针好处就是节省执行文件的空间。具体生成这个BSS段编译器在编译源文件时会识别未初始化的全局变量和静态变量将其标记为BSS类型编译多个文件会将所有BSS类型的变量合并到一个BSS段中记录该段的起始地址和大小。