Linux初始化:设备树与跨模态学习解析

需积分: 9 91 下载量 111 浏览量 更新于2024-08-09 收藏 1.84MB PDF 举报
"初始化流程-跨模态学习nlpcc2020 讲习班内容" 在Linux系统启动过程中,设备树(Device Tree)扮演着至关重要的角色,它提供了硬件配置的描述,使得内核能根据不同的硬件平台进行适配。在本文中,我们将深入探讨初始化流程中的设备树展开(unflatten)过程,特别是在X86和嵌入式平台(如ARM)上的启动流程。 设备树是一个二进制数据结构,通常存储在固件中,用于传递硬件信息给Linux内核。在X86平台,设备树常由UEFI或BIOS提供;而在嵌入式平台,如ARM,它可能由U-Boot传递。在Linux内核加载后,初始化流程中的一项关键任务就是解析这个设备树,将其转化为易于处理的树状结构。 `unflatten_device_tree`函数是这个过程的核心,它的主要工作是扫描DTB(Device Tree Blob),并将其转换成全局列表`struct device_node *of_allnodes`和树形结构。这个过程主要由`__unflatten_device_tree`函数完成,它接收DTB的指针、全局列表指针以及内存分配函数作为参数。 在扫描DTB时,`__unflatten_device_tree`函数会遍历每个设备节点(device node),计算整个设备树的大小,并一次性分配足够的内存,包括所有`struct device_node`、节点名称和`struct property`所需的空间。内存分配完成后,将清零填充,以确保数据的初始状态是干净的。在内存分配之后,还会在末尾放置一个校验值,如`0xdeadbeef`,用于检查后续处理是否导致了缓冲区溢出。 初始化阶段并不立即为每个设备节点分配内存,而是预先分配一大块内存,这有助于提高效率,避免频繁的内存分配操作。在扫描过程中,内核还会找到"/chosen"和"/aliases"节点,这两个节点分别包含了系统的配置选择和别名信息,这些信息在系统运行过程中会被广泛使用。 设备树的展开是Linux内核启动过程中的重要一环,它使得内核能够动态地发现和初始化硬件,适应各种不同的硬件平台。在X86平台,启动流程通常从GRUB引导加载器开始,接着加载内核镜像和可能的初始ramdisk(initrd)。而在嵌入式系统中,U-Boot通常负责加载内核映像和设备树,并传递给内核。无论是哪种平台,设备树都是连接固件和内核之间的桥梁,确保内核能够正确识别和驱动硬件。 在升级或编译自定义内核时,理解设备树的构造和初始化流程至关重要,因为它直接影响到内核对硬件的支持。通过`make menuconfig`配置内核选项,可以定制内核对特定硬件的支持,然后通过`make`命令编译生成内核镜像和模块。 设备树的初始化是Linux内核启动过程中的关键步骤,它使内核能够识别和配置硬件,从而确保系统的正常运行。在不同平台上,虽然启动流程可能有所不同,但设备树的作用始终如一,为硬件抽象提供了一个统一的接口。