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,欢呼吧……
ARMLinux启动代 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)