armlinux从入口到startkernel代码详细分析2.pdf
1.确定processortype
arch/arm/kernel/head.S中:
00075:mrcp15,0,r9,c0,c0@getprocessorid
00076:bl__lookup_processor_type@r5=procinfor9=cpuid
00077:movsr10,r5@invalidprocessor(r5=0)?
00078:beq__error_p@yes,errorp
75行:通过cp15协处理器的c0寄存器来获得processorid的指令.关于cp15
的详细内容可参考相关的arm手册
76行:跳转到__lookup_processor_type.在__lookup_processor_type中,会把
processortype存储在r5中
77,78行:判断r5中的processortype是否是0,如果是0,说明是无效的
processortype,跳转到__error_p(出错)
__lookup_processor_type函数主要是根据从cpu中获得的processorid和系统
中的proc_info进行匹配,将匹配到的proc_info_list的基地址存到r5中,0表示没
有找到对应的processortype.
下面我们分析__lookup_processor_type函数
arch/arm/kernel/head-common.S中:
00145:.type__lookup_processor_type,%function
00146:__lookup_processor_type:
00147:adrr3,3f
00148:ldmdar3,{r5-r7}
00149:subr3,r3,r7@getoffsetbetweenvirtphys
00150:addr5,r5,r3@convertvirtaddressesto
00151:addr6,r6,r3@physicaladdressspace
00152:1:ldmiar5,{r3,r4}@value,mask
00153:andr4,r4,r9@maskwantedbits
00154:teqr3,r4
00155:beq2f
00156:addr5,r5,#PROC_INFO_SZ@sizeof(proc_info_list)
00157:cmpr5,r6
00158:blo1b
00159:movr5,#0@unknownprocessor
00160:2:movpc,lr
00161:
00162:
00165: