2

此文一部分为转载,加上了一点点吐槽和自己的理解,如果要写到论文里请联系我,避免查重过不去

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>;
    };

猪了个去
349 声望5 粉丝

=w=快乐的Python程序猿


引用和评论

0 条评论