Linux裝置樹詳解 二 檔案構成

2021-09-25 13:41:35 字數 3409 閱讀 2184

裝置樹就是描述單板資源以及裝置的一種文字檔案。至於出現的原因,基本的語法和使用方法,上一章節做了基本的介紹。本篇文章主要是更深層次的**裝置檔案的構成。

device tree檔案的格式為dts,包含的頭檔案格式為dtsi,dts檔案是一種人可以看懂的編碼格式。但是uboot和linux不能直接識別,他們只能識別二進位制檔案,所以需要把dts檔案編譯成dtb檔案。dtb檔案是一種可以被kernel和uboot識別的二進位制檔案。把dts編譯成dtb檔案的工具是dtc。linux原始碼目錄下scripts/dtc目錄包含dtc工具的原始碼。在linux的scripts/dtc目錄下除了提供dtc工具外,也可以自己安裝dtc工具,linux下執行:sudo apt-get install device-tree-compiler安裝dtc工具。其中還提供了乙個fdtdump的工具,可以反編譯dtb檔案

dtc工具的使用方法是:

dtc –i dts –o dtb –o***.dtb ***.dts
dts和dtb檔案的轉換如圖1所示

本章我們將採用例項解析乙個dtb檔案,看看其原理是什麼樣的?

fdtdump工具使用,linux終端執行ftddump –h,輸出以下資訊:

review@ubuntu:~/

02_dtb$ fdtdump --h

usage: fdtdump [options]

options:

-[dshv]

-d,--debug dump debug information while decoding the file

-s,--scan scan for an embedded fdt in file

-h,--help print this help and exit

-v,--version print version and exit

本文採用 jz2440.dtb檔案為例說明fdtdump工具的使用。linux終端執行fdtdump

review@ubuntu:~/02_dtb$ fdtdump -d -s jz2440.dtb 

jz2440.dtb: found fdt at offset 0

/dts-v1/;

// magic: 0xd00dfeed

// totalsize: 0x1d1 (465)

// off_dt_struct: 0x48

// off_dt_strings: 0x188

// off_mem_rsvmap: 0x28

// version: 17

// last_comp_version: 16

// boot_cpuid_phys: 0x0

// size_dt_strings: 0x49

// size_dt_struct: 0x140

以上資訊便是device tree檔案頭資訊,儲存在dtb檔案的開頭部分。在linux核心中使用struct fdt_header結構體描述。struct fdt_header結構體定義在scripts\dtc\libfdt\fdt.**件中

struct  fdt_header  ;

/memreserve/ 33f00000 100000;

// 0048: tag: 0x00000001 (fdt_begin_node)

/ ;// 00e8: tag: 0x00000001 (fdt_begin_node)

chosen ;

// 014c: tag: 0x00000001 (fdt_begin_node)

led ;

// 0180: tag: 0x00000002 (fdt_end_node)

};

fdtdump工具的輸出資訊即是以上結構中每乙個成員的值,struct fdt_header結構體包含了device tree的私有資訊,並且device tree的檔案是以大端模式儲存。並且,頭部資訊和fdtdump的輸出資訊一致。

dtb檔案布局如下:

可以看出整個dtb分為四個部分:struct ftd_header、memory reservation block、structure block、strings block;

struct ftd_header:用來表明各個分部的偏移位址,整個檔案的大小,版本號等;

memory reservation block:在裝置樹中使用/memreserve/ 定義的保留記憶體資訊;

structure block:儲存節點的資訊,節點的結構;

strings block:儲存屬性的名字,單獨作為字串儲存;

對於dtb header,其各個含義定義如下:

header field name

description

magic

用來識別dtb的。通過這個magic,kernel可以確定bootloader傳遞的引數block是乙個dtb還是tag list

totalsize

dtb的total size

off_dt_struct

device tree structure block的offset

off_dt_strings

device tree strings block的offset

off_mem_rsvmap

offset to memory reserve map。有些系統,我們也許會保留一些memory有特殊用途(例如dtb或者initrd image),或者在有些dsp+arm的soc platform上,有寫memory被保留用於arm和dsp進行資訊互動。這些保留記憶體不會進入記憶體管理系統

version

該dtb的版本

last_comp_version

相容版本資訊

boot_cpuid_phys

我們在哪乙個cpu(用id標識)上booting

dt_strings_size

device tree strings block的size。和off_dt_strings一起確定了strings block在記憶體中的位置

dt_struct_size

device tree structure block的size。和off_dt_struct一起確定了device tree structure block在記憶體中的位置

Linux裝置樹詳解

arm linux社群為什麼要引入裝置樹 linux之父linus torvalds閒來無事,在翻看arm linux 的時候,有一天終於忍不住了。他在2011年3月17日的arm linux郵件列表中說道 this whole arm thing is a f cking pain in the ...

linux學習筆記二,檔案操作

在一般的檔案操作中,一般分為三個步驟,開啟檔案 操作檔案 關閉檔案。下面我們就安裝這三個步驟講解 一 開啟檔案。include include include int open const char path,int oflags int open const char path,int oflag...

Linux學習筆記 二 檔案管理

pwd ls cd cp mv rm ln mkdir cat more less head tail pwd命令,全稱是printworkingdirectory,用於顯示當前工作目錄的路徑 pwd home userls命令,全稱是list,用於列出當前工作目錄的內容,常用的引數如下 ls l ...