基于Linux2.6.38.8内核启动过程完全解析(3)

四:__lookup_machine_type 函数
__lookup_machine_type 和__lookup_processor_type像对孪生兄弟,它们的行为都是很类似的:__lookup_machine_type根据r1寄存器的机器编号到.arch.info.init段的数组中依次查找机器编号与r1相同的记录。它使了与它孪生兄弟同样的手法进行虚拟地址到物理地址的转换计算。

[cpp]

/*   * Lookup machine architecture in the linker-build list of architectures.   * Note that we can't use the absolute addresses for the __arch_info   * lists since we aren't running with the MMU on (and therefore, we are   * not in the correct address space).  We have to calculate the offset.   *   *  r1 = machine architecture number   * Returns:   *  r3, r4, r6 corrupted   *  r5 = mach_info pointer in physical address space   */   __lookup_machine_type:       adr r3, __lookup_machine_type_data       ldmia   r3, {r4, r5, r6}       sub r3, r3, r4          @ get offset between virt&phys       add r5, r5, r3          @ convert virt addresses to       add r6, r6, r3          @ physical address space   1:  ldr r3, [r5, #MACHINFO_TYPE]    @ get machine type       teq r3, r1              @ matches loader number?       beq 2f              @ found       add r5, r5, #SIZEOF_MACHINE_DESC    @ next machine_desc       cmp r5, r6       blo 1b       mov r5, #0              @ unknown machine   2:  mov pc, lr   ENDPROC(__lookup_machine_type)  

具体的请看:MACHINE_START and MACHINE_END Macro define 见  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22526.html