此文一部分为转载,加上了一点点吐槽和本身的理解,若是要写到论文里请联系我,避免查重过不去node
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。读者有兴趣能够统计下常见的s3c24十、s3c6410等板级目录,代码量在数万行。linux
社区必须改变这种局面,因而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使用状况
(再次说明了硬编码是原罪啊。。)dom
设备树结构以下:ui
/ { 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属性,方括号+空格,若是引用其余的变量,开头用&this
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三向对比了:debug
sun7i-a20-cubieboard2.dts
sun7i-a20-cubieboard2-xen.dts
sun7i-a20-cubietruck.dts
粗略总结出来了一份sun7i-a20-cubietruck-xen.dts,通常来讲,启动时的chosen选项设置了启动时选项,好比dom0的内存、打印到终端,好比initrd的地址。启动须要cpu进入硬件虚拟化模式,该模式是由引导器设置的。。
文件的开头大体是这样的:code
/ { 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>; };