微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux启动代码分析

ARM Linux启动代码分析

时间:11-09 来源:互联网 点击:

n标号处。

00196 __turn_mmu_on:00197     mov    r0, r000198     mcr    p15, 0, r0, c1, c0, 0        @ write control reg00199     mrc    p15, 0, r3, c0, c0, 0        @ read id reg00200     mov    r3, r300201     mov    r3, r1300202     mov    pc, r300203 ENDPROC(__turn_mmu_on)

需要注意的是在执行200行时,MMU已经开启,CPU以后发出的都是虚拟地址。201行,r3 = r13,而r13的值为__switch_data标号的绝对地址(虚拟地址),因此202行就跳到__switch_data标号处。

19     .type    __switch_data, %object20 __switch_data:21     .long    __mmap_switched22     .long    __data_loc            @ r423     .long    _data                @ r524     .long    __bss_start            @ r625     .long    _end                @ r726     .long    processor_id            @ r427     .long    __machine_arch_type        @ r528     .long    __atags_pointer            @ r629     .long    cr_alignment            @ r730     .long    init_thread_union + THREAD_START_SP @ sp

取出21行的代码执行,也即跳转到__mmap_switched标号处。

41 __mmap_switched:42     adr    r3, __switch_data + 443 44     ldmia    r3!, {r4, r5, r6, r7}45     cmp    r4, r5                @ Copy data segment if needed46 1:    cmpne    r5, r647     ldrne    fp, [r4], #448     strne    fp, [r5], #449     bne    1b50 51     mov    fp, #0                @ Clear BSS (and zero fp)52 1:    cmp    r6, r753     strcc    fp, [r6],#454     bcc    1b55 56  ARM(    ldmia    r3, {r4, r5, r6, r7, sp})57  THUMB(    ldmia    r3, {r4, r5, r6, r7}    )58  THUMB(    ldr    sp, [r3, #16]        )59     str    r9, [r4]            @ Save processor ID60     str    r1, [r5]            @ Save machine type61     str    r2, [r6]            @ Save atags pointer62     bic    r4, r0, #CR_A            @ Clear A bit63     stmia    r7, {r0, r4}            @ Save control register values64     b    start_kernel65 ENDPROC(__mmap_switched)

42行,获得__switch_data + 4的地址。

44行,将__data_loc的地址存到r4,_data的地址存到r5,__bss_start的地址存到r6,_end的地址存到r7。

45行,比较r4和r5的值,对于XIP,它们是不相等,这里显然是相等的,因此46到49行都不执行。

51到54行,清BSS段。

56行,r4 = processor_id,r5 = __machine_arch_type,r6 = __atags_pointer,r7 = cr_alignment,sp = init_thread_union + THREAD_START_SP。

57、58行,是对于Thumb状态的,这里啥也没做。

59到61行,将值存到对应的地址上。

62行,清掉r0的’A’位然后存到r4,该位表示数据存取是否需要对齐。

63行,保存r0,r4的值。

64行,start_kernel,欢呼吧……

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top