arm設備樹和xen

此文一部分爲轉載,加上了一點點吐槽和本身的理解,若是要寫到論文裏請聯繫我,避免查重過不去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>;
    };
相關文章
相關標籤/搜索