没有合适的资源?快使用搜索试试~ 我知道了~
首页uboot中start.S详解
uboot中start.S详解
需积分: 13 138 浏览量
更新于2023-03-16
评论
收藏 45KB DOC 举报
uboot中start.S详解 #include <config.h> #include <version.h> /* 这段代码的主要作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境 */ #if defined(CONFIG_OMAP1610) #include <./configs/omap1510.h> #elif defined(CONFIG_OMAP730) #include <./configs/omap730.h> #endif
资源详情
资源评论
资源推荐

#include <cong.h>
#include <version.h>
/* 这段代码的主要作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境
带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境 */
#if dened(CONFIG_OMAP1610)
#include <./congs/omap1510.h>
#elif dened(CONFIG_OMAP730)
#include <./congs/omap730.h>
#endif
/*************************************************************************
*
* Jump vector table as in table 3.1 in [1]
*
*************************************************************************/
.globl _start
_start: /* 系统复位位置, 各个异常向量对应的跳转代码 */
b reset /* 复位向量 */
ldr pc, _undened_instruction /* 未定义的指令异常向量 */
ldr pc, _software_interrupt /* 软件中断异常向量 */
ldr pc, _prefetch_abort /* 预取指令操作异常向量 */
ldr pc, _data_abort /* 数据操作异常向量 */
ldr pc, _not_used /* 未使用 */
ldr pc, _irq /* 慢速中断异常向量 */
ldr pc, _q /* 快速中断异常向量 */
_undened_instruction:
.word undened_instruction
_software_interrupt:
.word software_interrupt
_prefetch_abort:
.word prefetch_abort
_data_abort:
.word data_abort
_not_used:
.word not_used
_irq:
.word irq
_q:
.word q
.balignl 16,0xdeadbeef
/************************************************分析******************************
**********************
* 从中我们可以看出,ARM 支持 7 种异常。问题是发生了异常后 ARM 是如何响应的呢?
* 第一个复位异常很好理解,它放在 0x0 的位置,一上电就执行它,而且我们的程序总是从
* 复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。那么什么时候会执行

* 到后面几个异常处理函数呢?步骤是这样的:
*
* 当一个异常出现以后,ARM 会自动执行以下几个步骤:
* (1) 把下一条指令的地址放到连接寄存器 LR(通常是 R14),这样就能够在处理异常返回时从
正确的位置继续执行。
* (2) 将相应的 CPSR(当前程序状态寄存器)复制到 SPSR(备份的程序状态寄存器)中。从异
常退出的时候,就可以由 SPSR 来恢复 CPSR。
* (3) 根据异常类型,强制设置 CPSR 的运行模式位。
* (4) PC(程序计数器)被强制成相关异常向量处理函数地址,从而跳转到相应的异常处理程
序中。
*
* 当异常处理完毕后,ARM 会执行以下几步操作从异常返回:
* (1) 将连接寄存器 LR 的值减去相应的偏移量后送到 PC 中
* (2) 将 SPSR 复制回 CPSR 中
* (3) 若在进入异常处理时设置了中断禁止位,要在此清除
*
* ARM 规定了异常向量的地址:
* b reset ; 复位 0x0
* ldr pc, _undened_instruction ; 未定义的指令异常 0x4
* ldr pc, _software_interrupt ; 软件中断异常 0x8
* ldr pc, _prefetch_abort ; 预取指令 0xc
* ldr pc, _data_abort ; 数据 0x10
* ldr pc, _not_used ; 未使用 0x14
* ldr pc, _irq ; 慢速中断异常 0x18
* ldr pc, _q ; 快速中断异常 0x1c
* 这样理解这段代码就非常简单了。碰到异常时,PC 会被强制设置为对应的异常向量,从而跳
转到
* 相应的处理程序,然后再返回到主程序继续执行。
*
* .balignl 16,0xdeadbeef, 将地址对齐到 16 的倍数,如果地址寄存器的值(PC)跳过 4 个
字节才是 16 的倍数,
* 则使用 0xdeadbeef 填充这 4 个字节,如果它跳过 1、2、3 个字节,则填充值不确定。如果
地址寄存器的值(PC)
* 是 16 的倍数,则无需移动。
***********************************************************************************
*********************/
/*************************************************************************
*
* Startup Code (reset vector)
*
* do important init only if we don't start from memory!
* setup Memory and board specic bits prior to relocation.
* relocate armboot to ram
* setup stack

*
*************************************************************************/
/* 保存变量的数据区 */
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
/* These are dened in the board-specic linker script.*/
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
/*************************************************分析*****************************
*****************************
* 上面这段代码,主要保存一些全局变量,用于 BOOT 程序从 FLASH 拷贝到 RAM,或者其它
的使用。
* 还 有 一 些 变 量 的 值 是 通 过 连 接 脚 本 得 到 的 , 比 如 TEXT_BASE 位
于/u-boot-1.1.6/board/xxx(开发板目录名称)/cong.mk
* 文件里。__bss_start、_end 位于/u-boot-1.1.6/board/xxx(开发板目录名称)/u-boot.lds
文件里,具体值是由编译器算出来的。
***********************************************************************************
****************************/
/* the actual reset code*/
/* 系统的复位代码。系统一上电,就跳到这里运行 */
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr /* 取得当前程序状态寄存器 cpsr 到 r0 */
bic r0,r0,#0x1f /* 这里使用位清除指令,把中断全部清除,只置位模式控制位 为中断提供服
务通常是 OS
剩余10页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0