Android bootloader

Android bootloader  (ABL)

 

Froyo和GingerBread中用Android bootloader的比较多。ICS / JB后用open source u-boot的比较多。

 

一个典型的ABL源代码,包括一段start.s 汇编启动代码;一个指定memory layout的链接文件;其他若干编译成目标文件的C 代码。

 

1.1 start.s 启动代码

 

如果以某平台代码为例,它是 bootable/bootloader/lk/arch/arm/crt0.s

 

.section ".text.boot"
.globl _start
_start:
     b reset
     b arm_undefined
     b arm_syscall
     b arm_prefetch_abort
     b arm_data_abort
     b arm_reserved
     b arm_irq
     b arm_fiq

......

 

#if WITH_CPU_EARLY_INIT
 /* call platform/arch/etc specific init code */
#ifndef ENABLE_TRUSTZONE
 /* Not needed when TrustZone is the first bootloader that runs.*/
 bl __cpu_early_init                            // bootable/bootloader/lk/platform/arch_init.S 中设置晶振频率,L2 cache,
#endif
 /* declare return address as global to avoid using stack */
.globl _cpu_early_init_complete
 _cpu_early_init_complete:

#endif

 // 设置 interrupt vector

.Lstack_setup:
 /* set up the stack for irq, fiq, abort, undefined, system/user, and lastly supervisor mode */
 mrs     r0, cpsr
 bic     r0, r0, #0x1f

 ldr  r2, =abort_stack_top
 orr     r1, r0, #0x12 // irq
 msr     cpsr_c, r1
 ldr  r13, =irq_save_spot  /* save a pointer to a temporary dumping spot used during irq delivery */
    
 orr     r1, r0, #0x11 // fiq
 msr     cpsr_c, r1
 mov  sp, r2
            
 orr     r1, r0, #0x17 // abort
 msr     cpsr_c, r1
 mov  sp, r2
    
 orr     r1, r0, #0x1b // undefined
 msr     cpsr_c, r1
 mov  sp, r2
    
 orr     r1, r0, #0x1f // system
 msr     cpsr_c, r1
 mov  sp, r2

 orr  r1, r0, #0x13 // supervisor
 msr  cpsr_c, r1
 mov  sp, r2

 /* copy the initialized data segment out of rom if necessary */
 ldr  r0, =__data_start_rom
 ldr  r1, =__data_start
 ldr  r2, =__data_end

 cmp  r0, r1
 beq  .L__do_bss

 

// 计算重定位地址

 /* see if we need to relocate */
 mov  r0, pc
 sub  r0, r0, #(.Laddr - _start)
.Laddr:
 ldr  r1, =_start
 cmp  r0, r1
 beq  .Lstack_setup

 /* we need to relocate ourselves to the proper spot */
 ldr  r2, =__data_end 

.Lrelocate_loop:
 ldr  r3, [r0], #4
 str  r3, [r1], #4
 cmp  r1, r2
 bne  .Lrelocate_loop

 /* we're relocated, jump to the right address */
 ldr  r0, =.Lstack_setup
 bx  r0


1.2  链接文件


OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)



ENTRY(_start)

SECTIONS

{

/*Added TRUSTZONE at 0x0. Moving rest of APPSBL to %MEMBASE% */

    . = 0x0;

    .tzbsp 0x0 : {*tzbsp_bin.o(.data)}

    . = %MEMBASE%;

    .interp : { *(.interp) }

    .hash : { *(.hash) }

    .dynsym : { *(.dynsym) }

    .dynstr : { *(.dynstr) }

    .rel.text : { *(.rel.text) *(.rel.gnu.linkonce.t*) }

    .rela.text : { *(.rela.text) *(.rela.gnu.linkonce.t*) }

    .rel.data : { *(.rel.data) *(.rel.gnu.linkonce.d*) }

    .rela.data : { *(.rela.data) *(.rela.gnu.linkonce.d*) }

    .rel.rodata : { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }

    .rela.rodata : { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }

    .rel.got : { *(.rel.got) }

    .rela.got : { *(.rela.got) }

    .rel.ctors : { *(.rel.ctors) }

    .rela.ctors : { *(.rela.ctors) }

    .rel.dtors : { *(.rel.dtors) }

    .rela.dtors : { *(.rela.dtors) }

    .rel.init : { *(.rel.init) }

    .rela.init : { *(.rela.init) }

    .rel.fini : { *(.rel.fini) }

    .rela.fini : { *(.rela.fini) }

    .rel.bss : { *(.rel.bss) }

    .rela.bss : { *(.rela.bss) }

    .rel.plt : { *(.rel.plt) }

    .rela.plt : { *(.rela.plt) }

/*Moving harcoded addresses by a displacement of %MEMBASE%  */

    .init : { *(.init) } = %MEMBASE% + 0x9090

    .plt : { *(.plt) }



    /* text/read-only data */



/*Moving harcoded addresses by a displacement of %MEMBASE%  */

     .text : { *(.text .text.* .glue_7* .gnu.linkonce.t.*) } = %MEMBASE% + 0x9090



    .rodata : {

        *(.rodata .rodata.* .gnu.linkonce.r.*)

        . = ALIGN(4);

        __commands_start = .;

        KEEP (*(.commands))

        __commands_end = .;

        . = ALIGN(4);

        __apps_start = .;

        KEEP (*(.apps))

        __apps_end = .;

        . = ALIGN(4);

        __rodata_end = . ;

    }



    /* writable data  */

    __data_start_rom = .;    /* in one segment binaries, the rom data address is on top of the ram data address */

    __data_start = .;

    .data : SUBALIGN(4) { *(.data .data.* .gnu.linkonce.d.*) }



    __ctor_list = .;

    .ctors : { *(.ctors) }

    __ctor_end = .;

    __dtor_list = .;

    .dtors : { *(.dtors) }

    __dtor_end = .;

    .got : { *(.got.plt) *(.got) }

    .dynamic : { *(.dynamic) }


    __data_end = .;


    /* unintialized data (in same segment as writable data) */

    . = ALIGN(4);

    __bss_start = .;

    .bss : { *(.bss .bss.*) }

    . = ALIGN(4);

    _end = .;


    . = %MEMBASE% + %MEMSIZE%;

    _end_of_ram = .;



    /* Strip unnecessary stuff */

    /DISCARD/ : { *(.comment .note .eh_frame) }

}

1.3  platform-specific implementation


在ABL阶段,针对具体硬件平台主要支持如下功能:

  • UART
  • USB
  • MMU
  • Flash: Nand/eMMC
  • OTP
  • Display: LCD/LED


1.4   libc support


在ABL中一般自带一个简化的C 标准库的实现。 常用如下:

  • memcpy
  • memset
  • memcmp
  • malloc
  • strcpy
  • strlen
  • strstr
  • sprintf
  • printf



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值