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)。

相关推荐
17(无规则自律)11 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
weiyvyy1 天前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
Dylan~~~2 天前
AI编程新范式:规范驱动开发SpecKit框架完全指南
驱动开发·ai编程
阿拉斯攀登2 天前
【RK3576 安卓 JNI/NDK 系列 04】JNI 核心语法(下):字符串、数组与对象操作
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·jni字符串操作
weiyvyy2 天前
接口开发的完整流程:从需求到验证
驱动开发·嵌入式硬件·硬件架构·硬件工程
zly88653722 天前
windsurf rules与skill的使用
linux·c语言·开发语言·驱动开发
阿拉斯攀登3 天前
【RK3576 安卓 JNI/NDK 系列 09】RK3576 实战(三):JNI 调用 librga 实现 2D 硬件加速图像处理
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·rk3576 rga加速
阿拉斯攀登4 天前
第 19 篇 驱动性能优化与功耗优化实战
android·驱动开发·瑞芯微·嵌入式驱动·安卓驱动
道一云黑板报4 天前
技术拆解:AI低代码架构设计与全链路落地实现
人工智能·驱动开发·低代码·ai·企业微信·ai编程·代码规范
LXY_BUAA4 天前
《嵌入式操作系统》_高级字符设备驱动_20260316
linux·运维·服务器·驱动开发