此文一部分为转载,加上了一点点吐槽和自己的理解,如果要写到论文里请联系我,避免查重过不去
Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。读者有兴趣可以统计下常见的s3c2410、s3c6410等板级目录,代码量在数万行。
社区必须改变这种局面,于是PowerPC等其他体系架构下已经使用的Flattened Device Tree(FDT)进入ARM社区的视野。Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。
Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被hard code到kernel中):
CPU的数量和类别
内存基地址和大小
总线和桥
外设连接
中断控制器和中断使用情况
GPIO控制器和GPIO使用情况
Clock控制器和Clock使用情况
(再次说明了硬编码是原罪啊。。)
设备树结构如下:
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
每个节点可以有自己的属性,这个属性如果是字符串属性,那么用双引号引起来,如果是列表,那么用逗号隔开,如果是byte属性,方括号+空格,如果引用其他的变量,开头用&
Device Tree有自己的独立的语法,它的源文件为.dts,编译后得到.dtb,Bootloader在引导Linux内核的时候会将.dtb地址告知内核。之后内核会展开Device Tree并创建和注册相关的设备,因此arch/arm/mach-xxx和arch/arm/plat-xxx中大量的用于注册platform、I2C、SPI板级信息的代码被删除,而驱动也以新的方式和.dts中定义的设备结点进行匹配。
文件开头的include可以导入其他的include文件,文件类型是dtsi
xen在编译的时候可以加入dtb选项,对dom0的设备树进行特殊化。一般都会由带-xen后缀的dts编译出来,比如sun7i-a20-cubieboard2-xen.dts
目前还没有找到cubietruck-xen.dts,如果要自己编写的话,我根据meld三向对比了:
sun7i-a20-cubieboard2.dts
sun7i-a20-cubieboard2-xen.dts
sun7i-a20-cubietruck.dts
粗略总结出来了一份sun7i-a20-cubietruck-xen.dts,一般来说,启动时的chosen选项设置了启动时选项,比如dom0的内存、打印到终端,比如initrd的地址。启动需要cpu进入硬件虚拟化模式,该模式是由引导器设置的。。
文件的开头大致是这样的:
/ {
model = "Cubietech Cubietruck";
compatible = "cubietech,cubietruck", "allwinner,sun7i-a20";
chosen {
bootargs = "dom0_mem=512M sync_console console=dtuart dtuart=serial0";
xen,dom0-bootargs = "console=hvc0,115200n8 debug ignore_loglevel rw rootwait earlyprintk=xen clk_ignore_unused";
modules {
module@0 {
compatible = "xen,linux-zimage", "xen,multiboot-module";
reg = <0x50000000 0xf00000>;
};
.....
}
hypervisor {
compatible = "xen,xen-4.2", "xen,xen";
reg = <0xb0000000 0x20000>;
interrupts = <1 15 0xf08>;
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。