当前位置:首页 > 芯闻号 > 充电吧
[导读] 参考内容点此跳转 本文重点在于分析 uboot 启动流程以及 uboot 自身的细节,比如栈空间的划分、如何设置 tag 、如何添加一个自定义命令等。但是不涉及基本的硬件驱动的分析,比如内存初始化

参考内容点此跳转

本文重点在于分析 uboot 启动流程以及 uboot 自身的细节,比如栈空间的划分、如何设置 tag 、如何添加一个自定义命令等。但是不涉及基本的硬件驱动的分析,比如内存初始化、时钟初始化、mmu 、nandflash 等等这些详细细节不是我们的重点。

u-boot 版本:  uboot 1.1.6

使用的开发板: JZ2440V3   

一、链接脚本

    uboot1.1.6 的链接脚本 u-boot.lds 位于 u-boot-1.1.6boardsmdk2410 目录下:

ENTRY(_start)   SECTIONS   {       . = 0x00000000;  //起始地址        . = ALIGN(4);  //4字节对齐
    .text      :  //test指代码段,上面3行标识是不占用任何空间的
    {         cpu/arm920t/start.o   (.text)  //这里把start.o放在第一位就表示把start.s编译时放到最开始,这就是为什么把uboot烧到起始地址上它肯定运行的是start.s
      *(.text)       }          . = ALIGN(4);  //前面的 “.” 代表当前值,是计算一个当前的值,是计算上面占用的整个空间,再加一个单元就表示它现在的位置
    .rodata : { *(.rodata) }          . = ALIGN(4);       .data : { *(.data) }          . = ALIGN(4);       .got : { *(.got) }          . = .;       __u_boot_cmd_start = .;       .u_boot_cmd : { *(.u_boot_cmd) }       __u_boot_cmd_end = .;          . = ALIGN(4);       __bss_start = .;       .bss : { *(.bss) }       _end = .;   }       链接地址为 0 ?显然不应该,实际编译的时候执行的大概是这样一条语句:

    arm-Linux-ld -Bstatic -T u-boot.lds -Ttext 0x33F80000 start.o ...

    0x33F80000 在 board/smdk2410/config.mk 中定义,为 TEXT_BASE = 0x33F80000 (链接地址)

    整个 uboot 的入口 _start 包含在 cpu/arm920t/start.S 中


二、第一阶段

    uboot 的第一阶段主要工作是作基本的初始化工作,例如关看门狗、初始化时钟、初始化 sdram 以及代码重定位,为第二阶段做准备。这里的代码都是没有经过移植的源代码~!


  1、设置异常向量

.globl _start  /*声明一个符号可被其它文件引用,相当于声明了一个全局变量,.globl与.global相同*/
_start: b       reset  /* 复位,b是不带返回的跳转(bl是带返回的跳转),意思是无条件直接跳转到reset标号出执行程序*/
    ldr pc, _undefined_instruction  /* 未定义指令向量 ldr相当于mov操作*/
    ldr pc, _software_interrupt  /* 软件中断向量 */     ldr pc, _prefetch_abort  /* 预取指令异常向量 */
    ldr pc, _data_abort  /* 数据操作异常向量 */     ldr pc, _not_used  /* 未使用 */
    ldr pc, _irq  /* irq中断向量 */
    ldr pc, _fiq  /* fiq中断向量 */
 /* 中断向量表入口地址 */  _undefined_instruction: .word undefined_instruction  /*就是在当前地址,即_undefined_instruction 处存放 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  //word伪操作用于分配一段字内存单元(分配的单元都是字对齐的),并用伪操作中的expr初始化
_fiq:           .word fiq  /* now 16*4=64 */
       .balignl 16,0xdeadbeef       第一条 b reset ,决定了U-Boot启动后将自动跳转到标号“reset”处执行。因为刚开始运行时代码都是在片内 sram 里,我们在 sram 里调来调去的话就需要用位置无关码,那么 b 就是最佳选择,因为它是相对跳转。
    ldr    pc, _undefined_instruction

    _undefined_instruction:.word undefined_instruction

    感觉真是在卖弄,两条指令连起来的结果就是,CPU 会跳转到 undefined_instruction 链接地址处去执行(sdram里)。

    那么其实,一条 ldr pc,=undefined_instruction 就够了,它是位置有关码,绝对跳转。

    或许,uboot 的作者别有用意我没看透,不知道这是不是个伏笔。在u-boot2015里,就只有一个 reset 一个异常入口了。

 

  2、进入管理SVC模式

reset:       /*       * set the cpu to SVC32 mode       */       mrs r0,cpsr       bic r0,r0,#0x1f       orr r0,r0,#0xd3       msr cpsr,r0       ARM每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,叫做 当前程序状态寄存器,CPSR中一些位被用于标识各种状态,一些位被用于标识当前出于什么工作模式。

    

    有时候我们会碰到 CPSR_C ,它其实就是 CPSR 的低 8 位而已。


    I:1-禁止irq中断 0-允许irq中断

    F:1-禁止fiq中断 1-允许fiq中断

    T:1-Thumb 0-arm 指令集

    M0-M4 : 工作模式


    说了这么多,前边两条指令,先将 cpsr 低 5位 清零,然后或上 1101 0011B

    禁止了 irq 和 fiq 中断,工作在 arm 指令集,管理模式。

  3、关看门狗

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)       ldr     r0, =pWTCON       mov     r1, #0x0       str     r1, [r0]     4、屏蔽中断     /*       * mask all IRQs by setting all bits in the INTMR - default       */       mov r1, #0xffffffff       ldr r0, =INTMSK       str r1, [r0]   # if defined(CONFIG_S3C2410)       ldr r1, =0x3ff       ldr r0, =INTSUBMSK       str r1, [r0]   # endif       前边通过 cpsr 禁止 irq 和 fiq 使 cpu 不接受来自中断控制器的中断请求,而这里通过中断屏蔽使中断发生时,中断控制寄存器自身就不会上报给 cpu双保险。
  5、设置时钟 /* FCLK:HCLK:PCLK = 1:2:4 */   /* default FCLK is 120 MHz ! */   ldr r0, =CLKDIVN   mov r1, #3   str r1, [r0]    6、关 I/D cache 关 TLB /*   * flush v4 I/D caches   */   mov r0, #0   mcr p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */   mcr p15, 0, r0, c8, c7, 0   /* flush v4 TLB */  



    协处理器 p15 在2410的数据手册附录有介绍

    或者参考:http://blog.sina.com.cn/s/blog_858820890102v1gc.html

  7、关 mmu 

/*   * disable MMU stuff and caches   */   mrc p15, 0, r0, c1, c0, 0   bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)   bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)   orr r0, r0, #0x00000002 @ set bit 2 (A) Align   orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache   mcr p15, 0, r0, c1, c0, 0       这里主要涉及 P15 的 C1寄存器,用到的各位:


  8、初始化 sdram 控制器

.globl lowlevel_init   lowlevel_init:       /* memory control configuration */       /* make r0 relative the current location so that it */       /* reads SMRDATA out of FLASH rather than memory ! */       ldr     r0, =SMRDATA       ldr r1, _TEXT_BASE       sub r0, r0, r1       ldr r1, =BWSCON /* Bus Width Status Controller */       add     r2, r0, #13*4   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 (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))       .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))       .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))       .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))       .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))       .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))       .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))       .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))       .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))       .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)       .word 0x32       .word 0x30       .word 0x30       写裸机代码的入门操作,初始化 sdram 寄存器。

  9、代码重定位

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          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      adr 位置无关码,获取_start实际当前位于的地方,_TEXT_BASE 为 0x33f80000 ,这里判断的是代码是否直接运行在 sdram 里了,如果是就不需要重定位了。

    拷贝范围:_start 至 _bss_start 前,拷贝到 0x33f80000 处。

      33f80048 <_bss_start>:
      33f80048:    33fb064c

    0x33fb064c - 0x33f80000 = 193K ,什么意思呢?(整个 uboot 除了 bss 段) > 4k,如果是 nandflash 启动的话,SRAM只会复制NAND Flash存储器的前4K字节过去执行,我们需要复制的代码为193K,显然需要初始化 nandflash 并从里面读取 uboot 到内核,而我们到这里还没有初始化NandFlash,,从而得到默认 uboot是从norflash启动,不支持 nandflash 启动。

  10、设置栈

stack_setup:       ldr r0, _TEXT_BASE      /* upper 128 KiB: relocated uboot   */       sub r0, r0, #CFG_MALLOC_LEN /* malloc area                      */       sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */   #ifdef CONFIG_USE_IRQ       sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)    #endif       sub sp, r0, #12     /* leave 3 words for abort-stack    */      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       TEXT_BASE = 0x33F80000 其它的宏在 smdk2410.h (includeconfigs): #define CFG_MALLOC_LEN      (CFG_ENV_SIZE + 128*1024)   #define CFG_ENV_SIZE        0x10000 /* Total Size of Environment Sector */   #define CFG_GBL_DATA_SIZE   128   #define CONFIG_STACKSIZE_IRQ    (4*1024)    /* IRQ stack */   #define CONFIG_STACKSIZE_FIQ    (4*1024)    /* FIQ stack */   0x34000000:   (512K)               存放 uboot   0x33F80000:         TEXT_BASE   (64K+128K == 192K)   malloc区   0x33F50000:   (128bytes)           global data区,后边会提到主要放的gd、bd全局结构体   0x33F4FF80:            (8K)                 IRQ+FIQ的栈   0x33F4DF80:   (12byte)             abort-stack,栈溢出   0x33F4DF74:          sp  

  11、清 BSS 段 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  


三、第二阶段

ldr pc, _start_armboot      start_armboot:  .word start_armboot  

    跳转到 sdram 里的 start_armboot 函数执行。

总结:


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭