Android arm linux kernel启动流程
__lookup_processor_type: adr r3, 3f ldmda r3, {r5 - r7} sub r3, r3, r7 @ get offset between virt&phys add r5, r5, r3 @ convert virt addresses to add r6, r6, r3 @ physical address space 1: ldmia r5, {r3, r4} @ value, mask and r4, r4, r9 @ mask wanted bits teq r3, r4 beq 2f add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list) cmp r5, r6 blo 1b mov r5, #0 @ unknown processor 2: mov pc, lr ENDPROC(__lookup_processor_type)
他这里的执行过程其实比较简单就是在__proc_info_begin和__proc_info_end这个段里面里面去读取我们注册在里面的 proc_info_list这个结构体,这个结构体的定义在arch/arm/include/asm/procinfo.h,具体实现根据你使用的 cpu的架构在arch/arm/mm/里面找到具体的实现,这里我们使用的ARM11是proc-v6.S,我们可以看看这个结构体:
view plainprint?
- .section".proc.info.init",#alloc,#execinstr
- /*
- *MatchanyARMv6processorcore.
- */
- .type__v6_proc_info,#object
- _proc_info:
- .long0x0007b000
- .long0x0007f000
- .longPMD_TYPE_SECT|/
- PMD_SECT_BUFFERABLE|/
- PMD_SECT_CACHEABLE|/
- PMD_SECT_AP_WRITE|/
- PMD_SECT_AP_READ
- .longPMD_TYPE_SECT|/
- PMD_SECT_XN|/
- PMD_SECT_AP_WRITE|/
- PMD_SECT_AP_READ
- b__v6_setup
- .longcpu_arch_name
- .longcpu_elf_name
- .longHWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_JAVA
- .longcpu_v6_name
- .longv6_processor_functions
- .longv6wbi_tlb_fns
- .longv6_user_fns
- .longv6_cache_fns
- .size__v6_proc_info,.-__v6_proc_info
对着.h我们就知道各个成员变量的含义了,他这里lookup的过程实际上是先求出这个proc_info_list的实际物理地址,并将其内容读出,然后将其中的mask也就是我们这里的0x007f000与寄存器与之后与0x007b00进行比较,如果一样的话呢就校验成功了,如果不一样呢就会读下一个proc_info的信息,因为proc一般都是只有一个的,所以这里一般不会循环,如果检测正确寄存器就会将正确的proc_info_list的物理地址赋给寄存器,如果检测不到就会将寄存器值赋0,然后通过LR返回。
view plainprint?
- bl__lookup_machine_type@r5=machinfo
- movsr8,r5@invalidmachine(r5=0)?
- beq__error_a@yes,errora
检测完proc_info_list以后就开始检测machine_type了,这个函数的实现也在head-common.S里面,我们看看它具体的实现:
view plainprint?
- __lookup_machine_type:
- adrr3,3b
- ldmiar3,{r4,r5,r6}
- subr3,r3,r4@getoffsetbetweenvirt&phys
- addr5,r5,r3@convertvirtaddressesto
- addr6,r6,r3@physicaladdressspace
- 1:ldrr3,[r5,#MACHINFO_TYPE]@getmachinetype
- teqr3,r1@matchesloadernumber?
- beq2f@found
- addr5,r5,#SIZEOF_MACHINE_DESC@nextmachine_desc
- cmpr5,r6
- blo1b
- movr5,#0@unknownmachine
- 2:movpc,lr
- ENDPROC(__lookup_machine_type)
这里的过程基本上是同proc的检查是一样的,这里主要检查芯片的类型,比如我们现在的芯片是MSM7X27FFA,这也
Androidarmlinuxkernel启动流 相关文章:
- Android arm linux kernel启动流程一(11-09)
- Android arm linux kernel启动流程二(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)