ARM Linux:从__lookup_machine_type到确定机器类型详解(三)

需积分: 9 1 下载量 47 浏览量 更新于2024-12-09 收藏 29KB DOC 举报
本文档深入剖析了ARM Linux内核启动过程中的一个重要环节——从`arch/arm/kernel/head.S`文件中的`__lookup_machine_type`函数开始。这个函数在初始化阶段用于确定当前处理器的机器类型(machinetype),这对于后续的系统配置和功能选择至关重要。 在代码的79行,程序执行`bl __lookup_machine_type@r5 = machinfo`指令,调用了一个名为`__lookup_machine_type`的函数,其参数`r5`被设置为machinfo的地址。接下来(80、81行),如果传入的`r5`(即machinetype)不是有效的机器类型(即0),程序会跳转到`__error_a`错误处理路径。 `__lookup_machine_type`函数的具体实现可以从`head-common.S`中的00193行开始查找。首先(00195行),通过`adr r3, #__proc_info_begin`和`ldmia r3, {r4, r5, r6}`加载必要的参数,包括虚拟地址和物理地址转换所需的偏移量。然后(00197-00199行)计算虚拟地址到物理地址的转换,并获取`MACHINFO_TYPE`字段,该字段包含机器类型信息。 在00201行,程序检查获取的机器类型与预设的加载器编号是否匹配,如果匹配,则执行`beq 2f@found`,表示找到了正确的机器类型。如果不匹配,就会遍历`machine_desc`结构,依次检查下一个机器类型直到找到匹配项,或者当`r5`(指向下一个结构)小于`r6`(当前已检查的结构数量)时,进入循环的下一轮。 整个过程确保了Linux内核能够正确识别并初始化特定于硬件的特性,这对于支持各种不同架构的ARM处理器至关重要。理解这个函数的工作原理对于深入研究和修改ARM Linux内核,以及进行设备驱动开发都具有重要的实践意义。