内核启动过程中的设备树处理:__lookup_processor_type汇编解析

需积分: 0 2 下载量 196 浏览量 更新于2024-08-04 收藏 412KB DOCX 举报
在Linux内核的启动过程中,设备树(Device Tree Blob,DTB)起着关键作用,它提供了系统硬件配置的描述,包括处理器类型、内存布局、外设信息等。本文将详细介绍内核head.S文件中的设备树处理流程,重点分析`__lookup_processor_type`汇编函数及其在设备树加载过程中的作用。 首先,bootloader在启动内核时,会通过寄存器r0、r1和r2传递信息。r0通常设置为0,r1存储机器标识(但在使用设备树时未见使用),而r2则存放ATAGS或DTB的地址。ATAGS是早期Linux启动时的一种传统参数传递方式,而DTB提供更丰富的硬件描述信息。 在head.S文件中,设备树的处理开始于`__lookup_processor_type`函数,该函数通过读取CPUID来识别处理器类型,并找到对应的`proc_info_list`结构体,该结构体包含了初始化函数和CPU特性信息。这个过程涉及汇编指令,如`adr`用于获取地址,`ldmia`用于从内存中读取数据,以及算术运算,如获取虚拟地址与物理地址的偏移,并转换地址空间。 接下来,`__vet_atags`检查是否有可用的ATAGS数据,如果存在,会进行相应的处理。然后,`__create_page_tables`创建页表,建立虚拟地址到物理地址的映射,这是启用MMU(Memory Management Unit)之前的基础,因为MMU允许内核在保护模式下管理内存。 `__enable_mmu`函数使MMU处于启用状态,之后的操作都将使用虚拟地址。函数`__mmap_switched`在这个阶段被调用,它将bootloader传递的DTB地址保存到`__atags_pointer`变量中,确保内核能够访问到设备树数据。 内核对设备树的处理流程包括识别处理器类型、验证启动参数、初始化内存管理,最后是加载并利用设备树描述硬件配置。这个过程体现了内核启动时对硬件依赖的管理,确保了系统的稳定运行和资源的有效分配。理解这些细节对于深入学习Linux内核的开发者来说至关重要。