Uboot启动过程中的相关动作

本文详细介绍了Uboot的启动过程,特别关注了第一阶段中CPU工作模式的设置和中断关闭等关键步骤。通过分析start.S文件的内容,揭示了如何设置异常向量表并将CPU的工作模式更改为SVC。

Uboot执行分为两个阶段:
第一阶段:
a 将cpu的工作模式设置为SVC
b 关闭中断

1、首先执行start.S;
a->设置异常向量表
b->将CPU的工作模式改为SVC

### 君正 U-Boot 启动流程详解 #### 1. 初始化阶段 君正 U-Boot 的启动过程始于初始化阶段,在此期间硬件被配置到已知状态。这包括设置 CPU 寄存器、初始化存储控制器和其他必要的外围设备。这一部分通常由汇编代码实现,因为此时高级语言的支持尚未建立。 ```assembly _start: /* 设置堆栈指针 */ ldr sp, =_start_sp /* 跳转至 C 函数继续执行 */ bl lowlevel_init ``` 这段代码展示了 `_start` 是整个加载过程的起点[^2]。它负责设定初始环境并调用 `lowlevel_init()` 来进一步处理低级别的初始化工作。 #### 2. 高级初始化与自检 一旦基本硬件准备就绪,U-Boot 将进入更复杂的初始化步骤,比如检测和枚举连接到系统的各个组件。在此过程中会运行一系列诊断测试来验证硬件功能正常与否,并构建用于后续操作的数据结构。 #### 3. 加载操作系统映像 当所有准备工作完成后,U-Boot 开始履行其主要职责——即从非易失性存储介质(如 NAND Flash 或 SD 卡)中读取 Linux 内核或其他目标 OS 映像文件,并将其复制到 RAM 中适当的位置以便执行。对于君正架构而言,这意味着要特别注意支持特定处理器特性的驱动程序和服务。 #### 4. 控制权转移给内核 最后一步是将控制传递给刚刚装载好的内核镜像。在此之前可能还需要做一些额外的工作,例如传递命令行参数或者调整某些寄存器的状态以满足内核的要求。一旦这些都完成了,CPU 就会被重定向去执行新位置处的第一条指令,从而正式开启新的计算周期。 ```c /* 假设已经准备好一切条件 */ void jump_to_kernel(unsigned long image_addr) { typedef void (*kernel_entry)(int zero, int arch, unsigned long params); kernel_entry entry_point; entry_point = (kernel_entry)image_addr; // 执行前清理缓存等必要动作... entry_point(0, MACHINE_TYPE, atags_or_dtb); } ``` 上述伪代码片段说明了如何定义一个函数指针指向即将跳转的目标地址,并通过该指针间接调用内核入口点[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值