免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 651 | 回复: 0
打印 上一主题 下一主题

uboot start.s 详细分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-09 10:39 |只看该作者 |倒序浏览
最近在内核的移植,先搞bootloader,网上找了篇不错的东东,好象不牵扯版权的问题....
#include
#include
#include
//global声明一个符号可被其它文件引用,相当于声明了一个全局变量,.globl与.global相同。
//该部分为处理器的异常处理向量表。地址范围为0x0000 0000 ~ 0x0000 0020,刚好8条指令。
.globl _start
_start: b    reset
    ldr    pc, _undefined_instruction
    ldr    pc, _software_interrupt
    ldr    pc, _prefetch_abort
    ldr    pc, _data_abort
    ldr    pc, _not_used
    ldr    pc, _irq
    ldr    pc, _fiq
// .word伪操作用于分配一段字内存单元(分配的单元都是字对齐的),并用伪操作中的expr初始化。.long与.int作用与之相同。
_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:    .word prefetch_abort
_data_abort:        .word data_abort
_not_used:        .word not_used
_irq:            .word irq
_fiq:            .word fiq
// .align伪操作用于表示对齐方式:通过添加填充字节使当前位置满足一定的对齐方式。.balign的作用同.align。
// .align {alignment} {,fill} {,max}
//  其中:alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max,
//  就不进行对齐,例如:
//  .align 4  /* 指定对齐方式为字对齐 */
    .balignl 16,0xdeadbeef
/*
* Startup Code (reset vector)
*
* do important init only if we don't start from RAM!
* - relocate armboot to ram
* - setup stack
* - jump to second stage
*/
// TEXT_BASE在开发板相关的目录中的config.mk文件中定义, 它定义了
// 代码在运行时所在的地址, 那么_TEXT_BASE中保存了这个地址
_TEXT_BASE:
    .word    TEXT_BASE
// 声明 _armboot_start 并用 _start 来进行初始化,在board/u-boot.lds中定义。
.globl _armboot_start
_armboot_start:
    .word _start
/*
* These are defined in the board-specific linker script.
*/
// 声明_bss_start并用__bss_start来初始化,其中__bss_start定义在与板相关的u-boot.lds中。
// _bss_start保存的是__bss_start这个标号所在的地址, 这里涉及到当前代码所在
// 的地址不是编译时的地址的情况, 这里直接取得该标号对应的地址, 不受编译时
// 地址的影响. _bss_end也是同样的道理.
.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
/****************************************************************************/
/*                                        */
/* the actual reset code                            */
/*                                        */
/****************************************************************************/
//  MRS {} Rd,CPSR|SPSR 将CPSR|SPSR传送到Rd
//  使用这两条指令将状态寄存器传送到一般寄存器,只修改必要的位,再将结果传送回状态寄存器,这样可以最好地完成对CRSP或者SPSR的修改
//  MSR {} CPSR_|SPSR_,Rm 或者是 MSR {} CPSR_f|SPSR_f,#
//  MRS与MSR配合使用,作为更新PSR的“读取--修改--写回”序列的一部分
//   bic r0,r1,r2  ;r0:=r1 and not r2
//   orr ro,r1,r2  ;r0:=r1 or r2
//  这几条指令执行完毕后,进入SVC模式,该模式主要用来处理软件中断(SWI)
reset:
    mrs    r0,cpsr        /* set the cpu to SVC32 mode        */
    bic    r0,r0,#0x1f        /* (superviser mode, M=10011)        */
    orr    r0,r0,#0x13
    msr    cpsr,r0
    /*
     * we do sys-critical inits only at reboot,
     * not when booting from ram!
     */
//
// B----转移指令,跳转到指令中指定的目的地址
// BL---带链接的转移指令,像B一样跳转并把转移后面紧接的一条指令地址保存到链接寄存器LR(R14)中,以此来完成子程序的调用
// 该语句首先调用cpu_init_crit进行CPU的初始化,并把下一条指令的地址保存在LR中,以使得执行完后能够正常返回。
//
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl    cpu_init_crit        /* we do sys-critical inits        */
#endif
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
//调试阶段的代码是直接在RAM中运行的,而最后需要把这些代码固化到Flash中,因此U-Boot需要自己从Flash转移到
//RAM中运行,这也是重定向的目的所在。
//通过adr指令得到当前代码的地址信息:如果U-boot是从RAM开始运行,则从adr,r0,_start得到的地址信息为
//r0=_start=_TEXT_BASE=TEXT_BASE=0xa3000000;如果U-boot从Flash开始运行,即从处理器对应的地址运行,
//则r0=0x0000,这时将会执行copy_loop标识的那段代码了。
// _TEXT_BASE 定义在board/pxa255_idp/config.mk中
relocate:                /* relocate U-Boot to RAM        */
    adr    r0, _start        /* r0 <- current position of code   */
    ldr    r1, _TEXT_BASE    /* test if we run from flash or RAM */
    cmp    r0, r1            /* don't reloc during debug        */
    beq    stack_setup        /* 如果是从RAM启动,则开始设置堆栈 */
// 如果不是从RAM运行的话,则将代码拷贝到_TEXT_BASE标识的RAM中。
    ldr    r2, _armboot_start
    ldr    r3, _bss_start
    sub    r2, r3, r2        /* r2 <- size of armboot        */
    add    r2, r0, r2        /* r2 <- source end address        */
copy_loop:
    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
    cmp    r0, r2            /* until source end addreee [r2]    */
    ble    copy_loop
#endif    /* CONFIG_SKIP_RELOCATE_UBOOT */
    /* Set up the stack    */
stack_setup:
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
    sub    r0, r0, #CFG_MALLOC_LEN     /* malloc area  CFG_MALLOC_LEN----(CFG_ENV_SIZE(256K) + 128*1024)    */
    sub    r0, r0, #CFG_GBL_DATA_SIZE  /* bdinfo CFG_GBL_DATA_SIZE    128---size in bytes reserved for initial data */   
// 这里如果需要使用IRQ, 还有给IRQ保留堆栈空间, 一般不使用.
#ifdef CONFIG_USE_IRQ
    sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)  //二者均为4K
#endif
    sub    sp, r0, #12        /* leave 3 words for abort-stack    */
//该部分将未初始化数据段_bss_start----_bss_end中的数据清零。
clear_bss:
    ldr    r0, _bss_start        /* find start of bss segment */
    ldr    r1, _bss_end            /* stop here      */
    mov    r2, #0x00000000        /* clear    */
clbss_l:str    r2, [r0]            /* clear loop...  */
    add    r0, r0, #4
    cmp    r0, r1
    ble    clbss_l
// 通过该语句跳转到C代码执行,stage1的使命也算完成。
    ldr    pc, _start_armboot
// start_armboot位于 lib_arm/board.c 中,是一个系统初始化的接口函数
_start_armboot: .word start_armboot
/****************************************************************************/
/*                                        */
/* CPU_init_critical registers                        */
/*                                        */
/* - setup important registers                        */
/* - setup memory timing                            */
/*                                        */
/****************************************************************************/
/* mk@tbd: Fix this! */
#ifdef CONFIG_CPU_MONAHANS
#undef ICMR


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/58141/showart_1277073.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP