Linux设备树的传递以及kernel中对设备树的解析

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

当U-Boot加载设备树到内存后,ARM内核通过r2寄存器传递dtb地址。内核对dtb进行处理。使用bootm加载kernel镜像时,U-Boot跳转到boot_jump_linux函数。设备树传递方式与SoC架构相关。

🎯

关键要点

  • U-Boot将设备树加载到内存后,ARM内核通过r2寄存器传递dtb地址。
  • 内核获取dtb地址后进行进一步处理。
  • 使用bootm加载kernel镜像时,U-Boot跳转到boot_jump_linux函数。
  • 设备树的传递方式与SoC架构密切相关。
  • boot_jump_linux函数是U-Boot与kernel之间信息衔接的关键API。
  • r2寄存器的值可以通过bootm_header_t结构体的ft_addr或板级启动参数bi_boot_params获取。
  • bootm_header_t结构体用于存储设备树地址和长度。
  • kernel对设备树的解析分为两个阶段:校验和启动参数调整,设备树解压。
  • 第一阶段包括对dtb文件进行crc32校验和更新__machine_arch_type。
  • 第二阶段将设备树从FDT解压为EDT,生成device_node节点。
  • kernel创建platform_device时依据第二阶段的工作情况进行设备注册。

延伸问答

U-Boot如何加载设备树到内存?

U-Boot将设备树加载到内存后,ARM内核通过r2寄存器传递dtb地址。

内核如何处理设备树?

内核获取dtb地址后,进行校验和启动参数调整,随后将设备树解压为EDT,生成device_node节点。

boot_jump_linux函数的作用是什么?

boot_jump_linux函数是U-Boot与kernel之间信息衔接的关键API,负责将控制权转交给内核。

设备树的传递方式与什么相关?

设备树的传递方式与SoC架构密切相关,不同的SoC架构可能有不同的实现。

bootm_header_t结构体的作用是什么?

bootm_header_t结构体用于存储设备树的地址和长度,供内核在启动时使用。

内核对设备树的解析分为几个阶段?

内核对设备树的解析分为两个阶段:第一阶段是校验和启动参数调整,第二阶段是设备树解压。

➡️

继续阅读