63.dtb展开成device_node

内核是不认识dtb文件的,所以在初始化时会将dtb转化成可识别的device_node

cpp 复制代码
struct device_node {
    const char *name;              // 节点名称(如 "cpu")
    const char *full_name;         // 节点全路径(如 "/cpus/cpu@0")
    struct property *properties;   // 指向该节点的属性链表(如 reg, compatible 等)
    struct device_node *parent;    // 指向父节点
    struct device_node *child;     // 指向第一个子节点
    struct device_node *sibling;   // 指向兄弟节点
    // ... 其他内核管理相关的字段(如 phandle, flags 等)
};

device_node 大概长这样

展开过程

1. 核心流程概览

DTB 在内存中是连续的二进制数据,而 device_node 是通过指针相互连接的结构体对象。转换过程主要分为:扫描、内存分配、填充

阶段一:初始校验与早扫描

在正式转换前,内核会先通过 setup_machine_fdt() 验证 DTB 的合法性(Magic Number、CRC等),并扫描一些紧急信息(如内存基址、命令行参数 chosen 节点)。

阶段二:反扁平化(Unflattening)

这是最核心的一步,主要调用流程如下: start_kernel() -> setup_arch() -> unflatten_device_tree() -> __unflatten_device_tree()

2. 关键算法与步骤

__unflatten_device_tree() 会对 FDT 字节码进行两次遍历

第一轮遍历:计算空间

内核首先扫描整个 DTB,计算出转换后所有 device_node 结构体以及属性 property 所需的总内存大小。

  • 统计节点个数。

  • 统计属性个数及属性值的总长度。

第二轮遍历:解析并填充

在申请到足够的连续内存后,内核再次扫描 DTB,开始构建逻辑树:

  1. 创建节点 :遇到 OF_DT_BEGIN_NODE 标志时,分配并初始化一个 struct device_node

  2. 建立父子关系 :利用栈的思想,根据 DTB 的嵌套结构,设置节点的 parentchildsibling 指针。

  3. 解析属性 :遇到 OF_DT_PROP 标志时,解析属性名称和值,封装进 struct property 结构,并挂载到对应节点的 properties 链表上。

  4. 生成 Full Name :根据路径生成节点的完整路径名(如 /soc/uart@e0001000)。

相关推荐
小小工匠8 小时前
半年之后,规格驱动开发(SDD)框架格局重排:从 +863% 到 +18% 的分化
驱动开发
kruptos10 小时前
嵌入式 Linux 驱动开发:第一个内核模块怎么写?
linux·运维·驱动开发·嵌入式硬件
飞多学堂1 天前
每日开源硬件精选简报 2026-09-04
驱动开发·开源硬件·硬件开源·电子制作
lincats2 天前
大白话讲解Addy Osmani 的循环工程Loop Engineering工作流
人工智能·驱动开发·架构·prompt·状态模式·知识图谱
飞多学堂2 天前
每日开源硬件精选简报 2026-08-23
驱动开发·开源硬件·硬件开源·电子制作
路上有只喵2 天前
STM32 UI Designer:一个开源的嵌入式 LCD 界面可视化设计工具(自动生成 C 代码)
c语言·驱动开发·stm32
智购科技无人售货机工厂2 天前
2026自动售货机云端API设计规范:从RESTful到GraphQL的接口演进~YH
android·人工智能·驱动开发·单片机·云原生·pandas·设计规范
Jaixln_HRF3 天前
率能SS6548D 单通道16A/40V大电流H桥驱动芯片,45mΩ超低导通电阻,用于打印机/扫地机/工业设备
驱动开发·嵌入式硬件·硬件工程
又见情义6 天前
RK3568 + RTL8211F 网络唤醒(WOL)功能适配全记录
android·网络·驱动开发
DYWorker0016 天前
基于RK3568的Linux驱动开发:实战——WDT
linux·驱动开发