Bootloader 源码分析

Bootloader 完成了Linux系统启动前的硬件初始化,并将跳到C执行入口,进行firmware的初始化部分。这里主要分析汇编部分。

U-boot 启动过程属于多阶段类型。第一阶段完成CPU体系结构初始化,通常由汇编完成。第二阶段实现较为复杂的功能如实现初始化硬件、内存映射、TFTP传输,串口调试,内核参数传递等,通常由C语言实现。

1. 第一阶段代码分析

第一阶段的源文件包括CPU初始化相关以及开发板初始化相关分别对应/cpu/arm920t/start.S和board/***/lowlevel_init.S文件。

1.1. 硬件初始化

完成对CPU正常工作所必须初始化工作,如时钟、工作模式、MMU等。

reset:
    /*
     * 设置CPU 工作在超级保护模式(SVC32)
     */
     mrs r0,cpsr
    bic r0,r0,#0x1f
    orr r0,r0,#0xd3
    msr cpsr,r0
    ldr     r0, =pWTCON /*关闭看门狗*/
    mov     r1, #0x0
     str     r1, [r0]
   .....
bl  cpu_init_crit /*跳转到该标签设置CPU寄存器MMU Cache等*/

1.2 初始化SDRAM控制器

准备Bootloader第二阶段代码RAM空间。

lowlevel_init:
    ldr     r0, =SMRDATA /*13个寄存器值存放地址*/
    ldr r1, _TEXT_BASE
    sub r0, r0, r1      /*地址变换*/
    ldr r1, =BWSCON /* Bus Width Status Controller */
    add     r2, r0, #13*4   /*SMRDATA 末尾地址*/
    0:                          /*循环读取设置*/
    ldr     r3, [r0], #4
    str     r3, [r1], #4
    cmp     r2, r0
    bne     0b

    /* everything is fine now */
    mov pc, lr
    .ltorg
  /* the literal pools origin */
SMRDATA:
   .word ....

1.3 设置堆栈

stack_setup:
    ldr r0, _TEXT_BASE  /*代码段地址之前作为堆栈 */
    sub r0, r0, #CFG_MALLOC_LEN/*留给 malloc 动态分配*/
    sub r0, r0, #CFG_GBL_DATA_SIZE /*存放全局变量 */

#ifdef CONFIG_USE_IRQ
    sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
    /*IRQ和FIQ申请堆栈*/
#endif
    sub sp, r0, #12     /* 留下12字节的abord异常空间*/

1.4复制Bootloader第二阶段程序到RAM空间

relocate:               /* 将U-boot复制到RAM空间*/
    adr r0, _start      /* 当前代码地址作为源地址给r0 */
    ldr r1, _TEXT_BASE/*代码段链接地址作为目标地址给r1 */
    cmp     r0, r1         /* don't reloc during debug */
    beq     clear_bss    /*测试是否在RAM中调试,否则继续复制*/
    ldr r2, _armboot_start /*启动地址*/
    ldr r3, _bss_start  /*BSS段起始地址 即 代码段结束地址*/
    sub r2, r3, r2      /* 代码段大小给 r2*/
    bl  CopyCode2Ram    /*Nand启动时(位于bord/boot_init.c )
                           跳转复制函数 r0: source, r1: dest, r2: size*/
    add r2, r0, r2  /* r2 <- source end address*/
copy_loop: /*Nor flash 启动循环复制*/
    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

1.5 跳转到C入口

跳转之前清除堆栈空间,然后PC指针跳转到/lib_arm/board.c中的start_armboot( )函数开始执行bootloader的第二阶段代码。

ldr pc, _start_armboot
_start_armboot: .word start_armboot

2.第二阶段代码分析

Bootloader第二阶段完成工作从lib_arm/board.c中的start_armboot( )函数开始执行,也即是第一阶段跳转到的地址。从这部分开始下面全是由C编写完成,分析起来较为容易,不做过多介绍,依次完成的主要工作:

  • size = flash_init ();
  • nand_init(); /* go init the NAND */
  • env_relocate (); /* initialize environment */
  • devices_init (); /* get the devices list going. */
  • jumptable_init (); /* 初始化跳转列表 */
  • console_init_r (); /* fully init console as a device */
  • enable_interrupts ();/* 中断使能 */
  • board_late_init ();
  • eth_initialize(gd->bd);/* 初始化网口 */
  • 在main_loop ()中死循环,等待用户交互。
for (;;)
{
  main_loop ();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容