【摘抄】设备树有什么好处
1赞设想一下:bootloader刚刚将Linux内核复制到内存中,然后跳到内核的入口点。此时内核就像运行在处理器上的一个裸机程序。需要配置处理器,设置虚拟内存,向控制台打印一些信息。但是这些事情如何完成?所有的这些操作都要通过写寄存器来实现,但Linux内核如何知道这些寄存器的地址?如何知道当前有多少个CPU核可以使用?有多少内存可以访问?
最直接的办法就是在内核代码里为指定平台写好这些代码,由内核配置参数决定哪些平台代码将被启用。当一切都固定不变时这种方法还不错,比如在x86处理器上内部的寄存器,或是BIOS的访问。但对于变化量来说, 比如PCI/PCIe外设,就需要内核明确了解这些变化的细节。
ARM架构已经变成了Linux社区的一个在麻烦:即使处理器使用相同的编译器和函数,但具体到某一种芯片,它就有自己的寄存器地址和不同的配置方式。不仅如此,每种板子都有自己的外设。结果造成内核中有大量的头文件、补丁和特殊的配置参数,它们的一种组合就对应于一款芯片的一种特殊板型。总之,这造成了大量丑陋和不可维护的代码。
另外,每个编译出来的内核bin文件都是为某一款芯片的某一种板子,有点像为市场上某一款PC主板编译内核。所以很希望为所有ARM处理器编译内核时,让内核能以某种方式识别硬件,然后使用正确的驱动,就像一台PC一样。
怎么实现呢?在PC上,寄存器初始化是硬编码的,其他的信息由BIOS提供。所以当有另一块软件提供这些信息时,硬件自动检测也很容易。ARM处理器没有BIOS,Linux内核只能靠自己了。
解决方案是设备树device tree, 也称作Open Firmware(OF)或Flattened Device Tree(FDT)。本质上是一个字节码格式的数据结构,其中包含信息在内核启动时非常有用。bootloader在跳到内核入口点之前将这一块数据复制到RAM中的已知地址。
设备树的严格的规范,却没有规定哪些内容可以放置其中以及放置的位置。内核可以搜索设备树中的任意路径和参数。程序员来决定哪些配置作为参数放进设备树里,以及放置在什么地方。
采取标准的树结构,则可用一套方便的API来操作。例如,约定好如何定义总线上的外设,那么API可以获取到驱动所需的基本信息:地址、中断和自定义变量。后面会介绍更多。
对于我们大多数人来说,我们用设备树来向内核描述对硬件的添加或删除操作,作为响应,内核就可以加载或卸载相应的驱动。硬件的特殊信息也可以通过设备树来向内核传达。
以上内容摘抄自:http://www.cnblogs.com/sammei/p/3978438.html?utm_source=tuicool&utm_medium=referral
中文版翻译自:http://xillybus.com/tutorials/device-tree-zynq-1