==============================================
本文系本站原创,欢迎转载!转载请注明出处:http://www.cnblogs.com/gdt-a20
==============================================
以arm为例,分析一下kernel的启动过程;
内核版本:linux-3.2.tar.gz
一、arch/arm/kernel/head.s
1
19 .arm
20
21 __HEAD @#define __HEAD.section ".head.text","ax"
22 ENTRY(stext)
23
24 THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM.
25 THUMB( bx r9 ) @ If this is a Thumb-2 kernel,
26 THUMB( .thumb ) @ switch to Thumb now.
27 THUMB(1: )
28
29 setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode 关闭普通中断,快速中断,使能svc模式
30 @ and irqs disabled
31 mrc p15, 0, r9, c0, c0 @ get processor id 获得芯片ID
32 bl __lookup_processor_type @ r5=procinfo r9=cpuid 获得处理器型号,r5 == id,#1
33 movs r10, r5 @ invalid processor (r5=0)? 校验正确性,0错误
34 THUMB( it eq ) @ force fixup-able long branch encoding
35 beq __error_p @ yes, error 'p'
36
37 #ifndef CONFIG_XIP_KERNEL
38 adr r3, 2f
39 ldmia r3, {r4, r8}
40 sub r4, r3, r4 @ (PHYS_OFFSET - PAGE_OFFSET)
41 add r8, r8, r4 @ PHYS_OFFSET
42 #else
43 ldr r8, =PHYS_OFFSET @ always constant in this case #define PHYS_OFFSETUL(CONFIG_DRAM_BASE)
44 #endif
#1 :arch/arm/kernel/head-common.h
1
14 __CPUINIT
15 __lookup_processor_type:
16 adr r3, __lookup_processor_type_data @adr 相对偏移读取,读取下面type_data地址
17 ldmia r3, {r4 - r6} @将该地址存放的值 放入r4(.),r5(begin),r6(end)
18 sub r3, r3, r4 @ get offset between virt&phys 链接地址-实际地址=偏移量
19 add r5, r5, r3 @ convert virt addresses to 得到begin的虚拟起始地址
20 add r6, r6, r3 @ physical address space 得到end的虚拟起始地址
21 1: ldmia r5, {r3, r4} @ value, mask 得到r5的两个值到r3,r4
22 and r4, r4, r9 @ mask wanted bits 确定id值
23 teq r3, r4
24 beq 2f @相等返回,不等读取下一组
25 add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list)
26