日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

奇小葩讲设备树(2/5)-- Linux设备树详解(二)文件构成

發布時間:2023/12/15 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 奇小葩讲设备树(2/5)-- Linux设备树详解(二)文件构成 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設備樹就是描述單板資源以及設備的一種文本文件。至于出現的原因,基本的語法和使用方法,上一章節做了基本的介紹。本篇文章主要是更深層次的探討設備文件的構成。

1. devie tree的編譯

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 –oxxx.dtb xxx.dts

dts和dtb文件的轉換如圖1所示

2. Device Tree頭信息

本章我們將采用實例解析一個dtb文件,看看其原理是什么樣的?
fdtdump工具使用,Linux終端執行ftddump –h,輸出以下信息:

review@ubuntu:~/02_dtb$ fdtdump --h Usage: fdtdump [options] <file>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.h文件中

struct fdt_header {fdt32_t magic; /* magic word FDT_MAGIC */fdt32_t totalsize; /* total size of DT block */fdt32_t off_dt_struct; /* offset to structure */fdt32_t off_dt_strings; /* offset to strings */fdt32_t off_mem_rsvmap; /* offset to memory reserve map */fdt32_t version; /* format version */fdt32_t last_comp_version; /* last compatible version *//* version 2 fields below */fdt32_t boot_cpuid_phys; /* Which physical CPU id we're booting on *//* version 3 fields below */fdt32_t size_dt_strings; /* size of the strings block *//* version 17 fields below */fdt32_t size_dt_struct; /* size of the structure block */ }; /memreserve/ 33f00000 100000; // 0048: tag: 0x00000001 (FDT_BEGIN_NODE) / { // 0050: tag: 0x00000003 (FDT_PROP) // 0188: string: model // 005c: valuemodel = "SMDK24440"; // 0068: tag: 0x00000003 (FDT_PROP) // 018e: string: compatible // 0074: valuecompatible = "samsung,smdk2440"; // 0088: tag: 0x00000003 (FDT_PROP) // 0199: string: #address-cells // 0094: value#address-cells = <0x00000001>; // 0098: tag: 0x00000003 (FDT_PROP) // 01a8: string: #size-cells // 00a4: value#size-cells = <0x00000001>; // 00a8: tag: 0x00000001 (FDT_BEGIN_NODE)memory { // 00b4: tag: 0x00000003 (FDT_PROP) // 01b4: string: device_type // 00c0: valuedevice_type = "memory"; // 00c8: tag: 0x00000003 (FDT_PROP) // 01c0: string: reg // 00d4: valuereg = <0x30000000 0x00000002 0x00000003 0x69747264>; // 00e4: tag: 0x00000002 (FDT_END_NODE)}; // 00e8: tag: 0x00000001 (FDT_BEGIN_NODE)chosen { // 00f4: tag: 0x00000003 (FDT_PROP) // 01c4: string: bootargs // 0100: valuebootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200"; // 0148: tag: 0x00000002 (FDT_END_NODE)}; // 014c: tag: 0x00000001 (FDT_BEGIN_NODE)led { // 0154: tag: 0x00000003 (FDT_PROP) // 018e: string: compatible // 0160: valuecompatible = "jz2440_led"; // 016c: tag: 0x00000003 (FDT_PROP) // 01cd: string: pin // 0178: valuepin = <0x00050005>; // 017c: tag: 0x00000002 (FDT_END_NODE)}; // 0180: tag: 0x00000002 (FDT_END_NODE) };

fdtdump工具的輸出信息即是以上結構中每一個成員的值,struct fdt_header結構體包含了Device Tree的私有信息,并且Device Tree的文件是以大端模式儲存。并且,頭部信息和fdtdump的輸出信息一致。

3. Device Tree文件結構

DTB文件布局如下:

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

  • struct ftd_header:用來表明各個分部的偏移地址,整個文件的大小,版本號等;
  • memory reservation block:在設備樹中使用/memreserve/ 定義的保留內存信息;
  • structure block:保存節點的信息,節點的結構;
  • strings block:保存屬性的名字,單獨作為字符串保存;
  • 3.1 DTB header

    對于DTB header,其各個含義定義如下:

    header field namedescription
    magic用來識別DTB的。通過這個magic,kernel可以確定bootloader傳遞的參數block是一個DTB還是tag list
    totalsizeDTB的total size
    off_dt_structdevice tree structure block的offset
    off_dt_stringsdevice tree strings block的offset
    off_mem_rsvmapoffset 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_sizedevice tree strings block的size。和off_dt_strings一起確定了strings block在內存中的位置
    dt_struct_sizedevice tree structure block的size。和off_dt_struct一起確定了device tree structure block在內存中的位置

    總結

    以上是生活随笔為你收集整理的奇小葩讲设备树(2/5)-- Linux设备树详解(二)文件构成的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。