【转】
摘 要:设备树的引入减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux
支持包的开发,使得单个内核镜像能支持多个系统。作为U-Boot 和Linux 内核之间的动态
接口,本文阐述了设备树的数据存储格式以及源码描述语法,进而分析了U-Boot 对扁平设
备树的支持设置,Linux 内核对设备树的解析流程。
关键词:扁平设备树; DTS; PowerPC; Linux
IBM、Sun 等厂家的服务器最初都采用了Firmware(一种嵌入到硬件设备中的程序,用
于提供软件和硬件之间的接口),用于初始化系统配置,提供操作系统软件和硬件之间的接
口,启动和运行系统。后来为了标准化和兼容性,IBM、Sun 等联合推出了固件接口IEEE 1275
标准,让他们的服务器如IBM PowerPC pSeries,Apple PowerPC,Sun SPARC
等均采用Open
Firmware,在运行时构建系统硬件的设备树信息传递给内核,进行系统的启动运行[1]。这样
做的好处有,减少内核对系统硬件的严重依赖,利于加速支持包的开发,降低硬件带来的变
化需求和成本,降低对内核设计和编译的要求。
随着 Linux/ppc64 内核的发展,内核代码从原来的arch/ppc32 和arch/ppc64 逐渐迁移到
统一的arch/powerpc 目录,并在内核代码引入Open Firmware API 以使用标准固件接口[2]。
Linux 内核在运行时,需要知道硬件的一些相关信息。对于使用ARCH=powerpc 参数编译的
内核镜像,这个信息需要基于Open Firmware 规范,以设备树的形式存在[3]。这样内核在启
动时读取扫描Open Firmware 提供的设备树,从而获得平台的硬件设备信息,搜索匹配的设
备驱动程序并将该驱动程序绑定到设备。
在嵌入式 PowerPC 中,一般使用U-Boot 之类的系统引导代码,而不采用Open Firmware。
早期的U-Boot 使用include/asm-ppc/u-boot.h 中的静态数据结构struct bd_t
将板子基本信息传
递给内核,其余的由内核处理。这样的接口不够灵活,硬件发生变化就需要重新定制编译烧
写引导代码和内核,而且也不再适应于现在的内核。为了适应内核的发展及嵌入式PowerPC
平台的千变万化,吸收标准Open Firmware 的优点,U-Boot 引入了扁平设备树FDT 这样的
动态接口,使用一个单独的FDT blob(二进制大对象,是一个可以存储二进制文件的容器)
存储传递给内核的参数[3]。一些确定信息,例如cache 大小、中断路由等直接由设备树提供,
而其他的信息,例如eTSEC 的MAC 地址、频率、PCI 总线数目等由U-Boot 在运行时修改。
U-Boot 使用扁平设备树取代了bd_t,而且也不再保证对bd_t 的后向兼容。
2 设备树概念
简单的说,设备树是一种描述硬件配置的树形数据结构,有且仅有一个根节点[4]。它包
含了有关CPU、物理内存、总线、串口、PHY 以及其他外围设备信息等。该树继承了Open
Firmware IEEE 1275 设备树的定义。操作系统能够在启动时对此结构进行语法分析,以此配
置内核,加载相应的驱动。
3 设备树存储格式
U-B