LinuxDown

LinuxDown.com
Linux系统下载网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

Linux内核对设备树的数据存储格式以及源码描述语法

2023年7月16日 200点热度

设备树的引入降低了内核为支持新硬件而须要的改变,增强代码重用,加速了Linux支持包的开发,致使单个内核镜像能支持多个系统。作为U-Boot和Linux内核之间的动态插口,本文简述了设备树的数据储存格式以及源码描述句型,因而剖析了U-Boot对扁平设备树的支持设置,Linux内核对设备树的解析流程。

IBM、Sun等厂家的服务器最初都采用了Firmware(一种嵌入到硬件设备中的程序,用于提供软件和硬件之间的插口),用于初始化系统配置,提供操作系统软件和硬件之间的插口,启动和运行系统。后来为了标准化和兼容性,IBM、Sun等联合推出了固件插口IEEE1275标准,让她们的服务器如IBMPowerPCpSeries,ApplePowerPC,SunSPARC等均采用OpenFirmware,在运行时建立系统硬件的设备树信息传递给内核,进行系统的启动运行[1]。这样做的用处有,降低内核对系统硬件的严重依赖,利于加速支持包的开发,增加硬件带来的变化需求和成本,减少对内核设计和编译的要求。

随着Linux/ppc64内核的发展,内核代码从原先的arch/ppc32和arch/ppc64逐步迁移到统一的arch/powerpc目录,并在内核代码引入OpenFirmwareAPI以使用标准固件插口[2]。Linux内核在运行时,须要晓得硬件的一些相关信息。对于使用ARCH=powerpc参数编译的内核镜像,这个信息须要基于OpenFirmware规范,以设备树的方式存在[3]。这样内核在启动时读取扫描OpenFirmware提供的设备树,因而获得平台的硬件设备信息,搜索匹配的设备驱动程序并将该驱动程序绑定到设备。

在嵌入式PowerPC中,通常使用U-Boot之类的系统引导代码,而不采用OpenFirmware。初期的U-Boot使用include/asm-ppc/u-boot.h中的静态数据结构structbd_t将板子基本信息传递给内核,其余的由内核处理。这样的插口不够灵活,硬件发生变化就须要重新订制编译烧录引导代码和内核,但是也不再适应于现今的内核。为了适应内核的发展及嵌入式PowerPC平台的千变万化,吸收标准OpenFirmware的优点,U-Boot引入了扁平设备树FDT这样的动态插口,使用一个单独的FDTblob(二补码大对象,是一个可以储存二补码文件的容器)储存传递给内核的参数[3]。一些确定信息,比如cache大小、中断路由等直接由设备树提供,而其他的信息linux移植时需要编译设备树文件吗,比如eTSEC的MAC地址、频率、PCI总线数量等由U-Boot在运行时更改。U-Boot使用扁平设备树代替了bd_t,并且也不再保证对bd_t的后向兼容。

2设备树概念

简单的说,设备树是一种描述硬件配置的树状数据结构,有且仅有一个根节点[4]。它包含了有关CPU、物理显存、总线、串口、PHY以及其他外围设备信息等。该树承继了OpenFirmwareIEEE1275设备树的定义。操作系统就能在启动时对此结构进行句型剖析,借此配置内核,加载相应的驱动。

3设备树储存格式

U-Boot须要将设备树在显存中的储存地址传给内核。该树主要由三大部份组成:头(Header)、结构块(Structureblock)、字符串块(Stringsblock)。设备树在显存中的储存布局图1如下:

图1设备树储存格式图

Fig1ThelayoutofaDTblock

3.1头(header)

头主要描述设备树的基本信息,如设备树魔数标志、设备树块大小、结构块的偏斜地址等,其具体结构boot_param_header如下。这个结构中的值都是以大端模式表示,但是偏斜地址是相对于设备枝杈的起始地址估算的。

3.2结构块(structureblock)

扁平设备树结构块是线性化的树状结构,和字符串块一起组成了设备树的主体,以节点方式保存目标板的设备信息。在结构块中,节点起始标志为常值宏OF_DT_BEGIN_NODE,节点结束标志为宏OF_DT_END_NODE;子节点定义在节点结束标志前。一个节点可以概括为以OF_DT_BEGIN_NODE开始,包括节点路径、属性列表、子节点列表,最后以OF_DT_END_NODE结束的序列,每一个子节点自身也是类似的结构。

3.3字符串块(Stringsblock)

为了节约空间,将一些属性名adobe air linux,尤其是这些重复冗余出现的属性名,提取下来单独储存到字符串块。这个块中包含了好多有结束标志的属性名字符串。在设备树的结构块中储存了这种字符串的偏斜地址,这样可以很容易地查找到属性名字符串。字符串块的引入节约了嵌入式系统较为紧张的储存空间。

4设备树源码DTS表示

设备树源码文件(.dts)以可读可编辑的文本方式描述系统硬件配置设备树,支持C/C++形式的注释,该结构有一个惟一的根节点“/”,每位节点都有自己的名子并可以包含多个子节点。设备树的数据格式遵守了OpenFirmwareIEEEstandard1275。本文只阐述设备树数据布局及句型,Linux板级支持包开发者应当详尽参考IEEE1275标准[5]及其他文献[2][4]。为了说明,首先给出基于PowerPCMPC83498349E处理器的最小系统的设备树源码示例。

可以看见,这个设备树中有好多节点,每位节点都指定了节点单元名称。每一个属性前面都给出相应的值。以双冒号引出的内容为ASCII字符串,以尖括弧给出的是32位的16补码值。这个树结构是启动Linux内核所需节点和属性简化后的集合,包括了根节点的基本模式信息、CPU和化学显存布局,它还包括通过/chosen节点传递给内核的命令行参数信息。

/{

model="MPC8349EMITX";

compatible="MPC8349EMITX","MPC834xMITX","MPC83xxMITX";

#address-cells=;/*32bitaddress*/

#size-cells=;/*4GBsize*/

cpus{

#address-cells=;

#size-cells=;

PowerPC,8349@0{

device_type="cpu";

reg=;

d-cache-line-size=;/*32Bytes*/

i-cache-line-size=;

d-cache-size=;/*L1dcache,32K*/

i-cache-size=;

timebase-frequency=;/*frombootloader*/

bus-frequency=;

clock-frequency=;

};

};

memory{

device_type="memory";

reg=;/*256MB*/

};

chosen{

name="chosen";

bootargs="root=/dev/ramrwconsole=ttyS0,115200";

linux,stdout-path="/soc8349@e0000000/serial@4500";

};

};

4.1根节点

设备树的起始点称之为根节点"/"。属性model指明了目标板平台或模块的名称,属性compatible值指明和目标板为同一系列的兼容的开发板名称。对于大多数32位平台,属性

#address-cells和#size-cells的值通常为1。

4.2CPU节点

/cpus节点是根节点的子节点,对于系统中的每一个CPU,都有相应的节点。/cpus节点没有必须指明的属性,但指明#address-cells=和#size-cells=是个好习惯,这同时指明了每位CPU节点的reg属性格式,便捷为化学CPU编号。

此节点应包含板上每位CPU的属性。CPU名称通常写作PowerPC,,比如Freescale会使用PowerPC,8349来描述本文的MPC83498349E处理器。CPU节点的单元名应当是cpu@0的格式,此节点通常要指定device_type(固定为"cpu"),一级数据/指令缓存的表项

大小,一级数据/指令缓存的大小,核心、总线时钟频度等。在里面的示例中通过系统引导代码动态填写时钟频度相关项。

4.3系统显存节点

此节点用于描述目标板上数学显存范围,通常叫做/memory节点,可以有一个或多个。当有多个节点时,须要后跟单元地址给以分辨;只有一个单元地址时,可以不写单元地址,默认为0。

此节点包含板上数学显存的属性,通常要指定device_type(固定为"memory")和reg属性。其中reg的属性值以的方式给出,如上示例中目标板显存起始地址为0,大小为256M字节。

4.4/chosen节点

这个节点有一点特殊。一般,这儿由OpenFirmware储存可变的环境信息,比如参数,默认输入输出设备。

这个节点中通常指定bootargs及linux,stdout-path属性值。bootargs属性设置为传递给内核命令行的参数字符串。linux,stdout-path经常为标准终端设备的节点路径名,内核会借此作为默认终端。

linux移植时需要编译设备树文件吗_编译设备树文件命令_编译器的移植

U-Boot在1.3.0版本后添加了对扁平设备树FDT的支持,U-Boot加载Linux内核、Ramdisk文件系统(假如使用的话)和设备树二补码镜像到化学显存以后,在启动执行Linux内核之前,它会更改设备树二补码文件。它会填充必要的信息到设备树中,比如MAC地址、PCI总线数量等。U-Boot也会填写设备树文件中的“/chosen”节点,包含了例如并口、根设备(Ramdisk、硬盘或NFS启动)等相关信息。

4.5片上系统SOC节点

此节点拿来描述片上系统SOC,假如处理器是SOC,则此节点必须存在。顶尖SOC节点包含的信息对此SOC上的所有设备可见。节点名应当包含此SOC的单元地址,即此SOC显存映射寄存器的基址。SOC节点名以/soc的方式命名,比如MPC8349的SOC

节点是"soc8349"。

在属性中应当指定device_type(固定为"soc")、ranges、bus-frequency等属性。ranges属性值以的方式指定。SOC节点还包含目标板使用的每位SOC设备子节点,应当在设备树中尽可能详尽地描述此SOC上的外围设备。如下给出带有看门狗设备的SOC节点DTS示例。

soc8349@e0000000{

#address-cells=;

#size-cells=;

device_type="soc";

compatible="simple-bus";

ranges=;/*size1MB*/

reg=;

bus-frequency=;/*frombootloader*/

{

device_type="watchdog";

compatible="mpc83xx_wdt";

reg=;/*offset:0x200*/

};

};

4.6其他设备节点

分级节点拿来描述系统上的总线和设备,类似数学总线拓扑linux软件工程师,能很便捷的描述设备间的关系。对于系统上的每位总线和设备,在设备树中都有其节点。对于这种设备属性的描述和定义请详尽参考IEEE1275标准及本文参考文献[2]。

设备树的中断系统稍显复杂,设备节点借助interrupt-parent和interrupts属性描述到中断控制器的中断联接。其中interrupt-parent属性值为中断控制器节点的表针,#interrupts属性值描述可触发的中断讯号,其值格式与中断控制器的interrupt-cells属性值有关。通常

#interrupt-cells属性值为2,interrupts属性就对应为一对描述硬件中断号和中断触发形式的十六补码值。

5扁平设备树编译

依据嵌入式板的设备信息写设备树源码文件(.dts)一般比较简单,而且手写二补码的扁平设备树(.dtb)就变得比较复杂了。设备树编译器dtc就是拿来依据设备树源码的文本文件生成设备树二补码镜像的。dtc编译器会对输入文件进行句型和语义检测,并按照Linux内核的要求检测各节点及属性,将设备树源码文件(.dts)编译二补码文件(.dtb),以保证内核能正常启动。dtc编译器的使用方式如下所示[6]:dtc[-Idts][-Odtb][-oopt_file][-Vopt_version]ipt_file2.6.25版本以后的内核源码早已包含了dtc编译器。在配置编译内核时选中CONFIG_DTC,会手动生成设备树编译器dtc。将编撰的目标板设备树文件mpc8349emitx.dts放在内核源码的arch/powerpc/boot/dts/目录下,借助内核Makefile生成blob的简单规则,使

用以下命令亦可完成设备树的dtc编译:

$makempc8349emitx.dtb

6U-Boot相关设置说明

为使U-Boot支持设备树,须要在板子配置头文件中设置一系列宏变量。如本文在

MPC8349E处理器目标板中移植的U-Boot配置如下:

/*passopenfirmwareflattree*/

#defineCONFIG_OF_LIBFDT1

#undefCONFIG_OF_FLAT_TREE

#defineCONFIG_OF_BOARD_SETUP1

#defineCONFIG_OF_HAS_BD_T1

#defineCONFIG_OF_HAS_UBOOT_ENV1

启动引导代码U-Boot在完成自己的工作以后,会加载Linux内核,并将扁平设备树的

地址传递给内核,其代码方式如下:

#ifdefined(CONFIG_OF_FLAT_TREE)||defined(CONFIG_OF_LIBFDT)

if(of_flat_tree){/*devicetree;bootnewstyle*/

/*

*LinuxKernelParameters(passingdevicetree):

*r3:pointertothefdt,followedbytheboardinfodata

*r4:physicalpointertothekernelitself

*r5:NULL

*r6:NULL

*r7:NULL

*/

(*kernel)((bd_t*)of_flat_tree,(ulong)kernel,0,0,0);

/*doesnotreturn*/

}

#endif

arch/powerpc内核的入口有且只有一个,入口点为内核镜像的起始。此入口支持两种调用方法,一种是支持OpenFirmware启动,另一种对于没有OF的引导代码,须要使用扁平设备树块,如上示例代码。寄存器r3保存指向设备树的数学地址表针,寄存器r4保存为内

核在数学显存中的地址,r5为NULL。其中的蕴涵意思为:假定开启了mmu,这么这个mmu的映射关系是1:1的映射,即虚拟地址和化学地址是相同的。

7Linux内核对设备树的解析

扁平设备树描述了目标板平台中的设备树信息。每位设备都有一个节点来描述其信息,每位节点又可以有子节点及其相应的属性。内核源码中include/linux/of.h及drivers/of/base.c等文件中提供了一些OpenFirmwareAPI,通过这种API,内核及设备驱动可以查找到相应

的设备节点,读取其属性值,借助这种信息正确地初始化和驱动硬件。

图2内核及驱动对扁平设备树的解析

Fig2InteractionfromkernelanddriverswiththeFDTblob

8推论

本文介绍了设备树的起源及其优点,因而探讨了设备树的数据储存格式以及源码描述句型,给出了设备树的编译方式linux移植时需要编译设备树文件吗,最后引出了移植过程中的U-Boot相关设置说明及内核的解析过程剖析。设备树为嵌入式系统向Linux内核传递参数的动态插口,本文以MPC8349E

处理器目标板上的DTS移植经历作总结,希望对嵌入式PowerPCLinux开发者具有一定的参考价值,可以推动嵌入式PowerPCLinux开发中的设备树DTS移植过程。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 内核 描述 源码 节点 设备
最后更新:2023年7月16日

Linux系统下载网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux系统下载网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux系统助你轻松查看sh文件内容 熠熠生辉的C语言Linux开发者的好书和技术参考资料 fedora win7 双系统 Fedora与Win7双系统完美融合 Windows10版本1803和更高版本重置密码18031803 yum安装PHP5.4的亲身体验系统管理员 编译流程(12、GCC、hello.s)预处理 不同操作系统中比较常见的文件系统定义是什么 快速掌握fedora终端打开技巧 Ubuntu下软件安装的几种方式,及apt工具的使用 Red Hat Linux AS下载对比 深度解析Linux网络带宽测试,揭秘速度与激情 文件路径例子及应用软件下载工具 Fedora安装Steam,一键搞定 修改root用户的密码需要注意哪些问题? Linux僵死:解决与预防 开始开发小程序的第一步,你的小程序之旅 Linux移植:地址划分与分配解析 应用软件工程师的隐形之道:驱使硬件设备行动 Linux命令与Shell脚本实践:九个重点指南 phpWeChat微信+网站开发框架功能亮点解析!安装方法
完成远程连接以后就可以安装图形化界面,配置低了会比较卡Linux系统助你轻松查看sh文件内容快速了解Linux内核版本,查看命令揭秘!SUSELinux12SP5的安装步骤及安装方法Linux部署Tomcat项目对比评测基于精简指令集计算原理建立的CPU体系结构有不同的特点和应用场景Linux操作系统:端口查进程用做ASIC芯片的EDA仿真工具来做FPGA的仿真调试ghost linux系统 备受瞩目的Ghost Linux:稳定性与性能共赢Centos7无人值守安装系统架构及工作原理启动畅行编程世界,掌握Linux Java环境LinuxCentOS7中如何安装字体库以及中文字体?Linux Find命令:简单使用正则统计次数本地Windows远程桌面连接阿里云Ubuntu16.04服务器:1linux 解压zip文件 (Linux基础知识)Linux常用的压缩命令和常见用法打造高效稳定的Linux网络应用(Linux基础知识)linuxuserdel命令是系统管理员命令解决Linux命令行中文乱码问题Linux内核下载地址,Linux之旅加速!《Linux命令大全Linuxscp命令》命令
解决Linux命令行中文乱码问题 Linux系统上的深度QQ下载指南 一个如何记录ssh命令操作的小技巧-OpenSSH命令 Linux内核烧入eMMC和远程加载的几种方式 LinuxCentOS7中如何安装字体库以及中文字体? 文件系统数据权限设计是一项重要的任务,确保数据安全 魅族PRO5刷出厂版ROM重启至Recovery模式后的画面 极点五笔:Fedora20使用经验与技巧,值得收藏! unzip linux Linux命令行删除文件夹回答:要在Linux中删除 deb怎么安装deb文件deb包的2种安装方式介绍 Linux系统连接服务器:从入门到精通的技巧! 掌握Linux FTP用户密码,提高密码安全性 linux新手安装Fedora时参考了网上大部分文章的解决问题 inode linux 安装 高效稳定!inodeLinux安装优化攻略 有个发行版居然模仿起了Win11系统,还内置安卓虚拟机 光驱依赖各种各样的linux程度也越来越高,怎么办? Ubuntu下软件安装的几种方式,及apt工具的使用 轻松下载安装Linux操作系统ISO,快速上手! Linux上安装gcc-c++,可以通过以下步骤完成!
标签聚合
应用 软件 文件 安装 linux系统 电脑 命令 内核 操作 linux服务器
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 118篇
  • 2023年8月 / 122篇
  • 2023年7月 / 122篇
  • 2023年6月 / 119篇
  • 2023年5月 / 123篇
  • 2023年4月 / 113篇
  • 2023年3月 / 265篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 LinuxDown.com ALL RIGHTS RESERVED.

京ICP备14023444号-2