精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux設(shè)備樹詳解(二) DTB文件格式

ebaina ? 來(lái)源:ebaina ? 作者:ebaina ? 2023-08-10 16:02 ? 次閱讀

一、背景

dtb作為二進(jìn)制文件被加載到內(nèi)存中,然后由內(nèi)核讀取并進(jìn)行解析,如果對(duì)dtb文件的格式不了解,那么在看設(shè)備樹解析相關(guān)的內(nèi)核代碼時(shí)將會(huì)寸步難行,而閱讀源代碼才是了解設(shè)備樹最好的方式。

所以,如果需要更透徹的了解設(shè)備樹解析的細(xì)節(jié),第一步就是需要了解設(shè)備樹的格式。

二、dtb的由來(lái)

設(shè)備樹的一般操作方式是:開發(fā)人員根據(jù)開發(fā)需求編寫dts文件,然后使用dtc將dts編譯成dtb文件。

DTB文件是由DTS文件通過(guò)dtc命令編譯生成的二進(jìn)制文件。DTS文件不能直接被內(nèi)核解析,需要編譯成DTB文件才可以直接被內(nèi)核識(shí)別并解析使用的。

dts文件是文本格式的文件,而dtb是二進(jìn)制文件,在linux啟動(dòng)時(shí)被加載到內(nèi)存中,接下來(lái)我們需要來(lái)分析設(shè)備樹dtb文件的格式。

三、dts和dtb文件的

編譯.dts文件生成DTB文件:

dtc -I dts -O dtb -o output.dtb input.dts

匯編DTB文件生成.dts文件:

dtc -I dtb -O dts -o output.dts input.dtb

四、dtb格式總覽

dtb的格式是這樣的:

wKgZomTUmKWADopgAABaAVU3oUE911.png

4.1dtbheader

但凡涉及到數(shù)據(jù)的記錄,就一定會(huì)有一個(gè)總的描述部分,就像磁盤的超級(jí)塊,書的目錄,dtb當(dāng)然也不例外,這個(gè)描述頭部就是dtb的header部分,通過(guò)這個(gè)header部分,用戶可以快速地了解到整個(gè)dtb的大致信息。header可以用這么一個(gè)結(jié)構(gòu)體來(lái)描述:

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

各字段含義如下:

magic

設(shè)備樹的魔數(shù),魔數(shù)其實(shí)就是一個(gè)用于識(shí)別的數(shù)字,表示設(shè)備樹的開始,linuxdtb的魔數(shù)為0xd00dfeed.

totalsize

這個(gè)設(shè)備樹的size,也可以理解為所占用的實(shí)際內(nèi)存空間。

off_dt_struct

offsettodt_struct,表示整個(gè)dtb中structure部分所在內(nèi)存相對(duì)頭部的偏移地址

off_dt_strings

offsettodt_string,表示整個(gè)dtb中string部分所在內(nèi)存相對(duì)頭部的偏移地址

off_mem_rsvmap

offsettomemoryreservemap,dtb中memoryreservemap所在內(nèi)存相對(duì)頭部的偏移地址,

version

設(shè)備樹的版本,截至目前的最新版本為17.

last_comp_version

最新的兼容版本

boot_cpuid_phys

這部分僅在版本2中存在,后續(xù)版本不再使用。

size_dt_strings

表示整個(gè)dtb中string部分的大小

size_dt_struct

表示整個(gè)dtb中struct部分的大小

alignmentgap

中間的alignmentgap部分表示對(duì)齊間隙,它并非是必須的,它是否被提供以及大小由具體的平臺(tái)對(duì)數(shù)據(jù)對(duì)齊和的要求以及數(shù)據(jù)是否已經(jīng)對(duì)齊來(lái)決定。

memoryreservemap

memoryreservemap:描述保留的內(nèi)存部分,這個(gè)map的數(shù)據(jù)結(jié)構(gòu)是這樣的:

{ uint64_t physical_address; uint64_t size; }

這部分存儲(chǔ)了此結(jié)構(gòu)的列表,整個(gè)部分的結(jié)尾由一個(gè)數(shù)據(jù)為0的結(jié)構(gòu)來(lái)表示(即physical_address和size都為0,總共16字節(jié))。

這一部分的數(shù)據(jù)并非是節(jié)點(diǎn)中的memory子節(jié)點(diǎn),而是在設(shè)備開始之前(也就是第一個(gè)花括號(hào)之前)定義的,例如:

/dts-v1/ /memreserve/ 0x10000000 0x100000 /*在結(jié)構(gòu)提中的表示為 physical_address=0x10000000,size=0x100000 */ { ... }

這一部分的作用是告訴內(nèi)核哪一些內(nèi)存空間需要被保留而不應(yīng)該被系統(tǒng)覆蓋使用,因?yàn)樵趦?nèi)核啟動(dòng)時(shí)常常需要?jiǎng)討B(tài)申請(qǐng)大量的內(nèi)存空間,只有提前進(jìn)行注冊(cè),用戶需要使用的內(nèi)存才不會(huì)被系統(tǒng)征用而造成數(shù)據(jù)覆蓋。

值得一提的是,對(duì)于設(shè)備樹而言,即使不指定保留內(nèi)存,系統(tǒng)也會(huì)默認(rèn)為設(shè)備樹保留相應(yīng)的內(nèi)存空間。

同時(shí),這一部分需要64位(8字節(jié))對(duì)齊。

4.2device-treestructure

device-treestructure:每個(gè)節(jié)點(diǎn)都會(huì)被描述為一個(gè)struct,節(jié)點(diǎn)之間可以嵌套,因此也會(huì)有嵌套的struct。

structure的的結(jié)構(gòu)是這樣的:

一個(gè)node開始信號(hào),OF_DT_BEGIN_NODE,內(nèi)容為:0x00000001

對(duì)于版本1-3而言,這一部分是節(jié)點(diǎn)的全路徑,以/開頭,而對(duì)于版本16及以上,這部分只是unitname(root除外,它沒有unitname),unitname是以0結(jié)尾的字符串

可選的對(duì)齊字節(jié)

對(duì)于每個(gè)屬性字段:

如果有子節(jié)點(diǎn),遞歸地對(duì)子節(jié)點(diǎn)進(jìn)行描述。

節(jié)點(diǎn)結(jié)束信號(hào),OF_DT_END_NODE,數(shù)據(jù)為0x00000002.

每個(gè)節(jié)點(diǎn)的信息都按照上述結(jié)構(gòu)被描述,需要注意的是,所有用于描述一個(gè)特定節(jié)點(diǎn)的屬性都必須在任何子節(jié)點(diǎn)之前定義,雖然設(shè)備樹的層次結(jié)構(gòu)不會(huì)因此產(chǎn)生二義性,但是linuxkernel的解析程序要求這么做。

4.3device-treestrings

device-treestrings:在dtb中有大量的重復(fù)字符串,比如"model","compatile"等等,為了節(jié)省空間,將這些字符串統(tǒng)一放在某個(gè)地址,需要使用的時(shí)候直接使用索引來(lái)查看。

需要注意的是,屬性部分格式為key=value,key部分被放置在strings部分,而value部分的字符串并不會(huì)放在這一部分,而是直接放在structure中。

五、dtb文件解析示例

光說(shuō)不練假把式,下面我就使用一個(gè)簡(jiǎn)單的示例來(lái)剖析dtb的文件格式。

下述示例僅僅是一個(gè)演示demo,不針對(duì)任何平臺(tái),為了演示方便,編寫了一個(gè)非常簡(jiǎn)單的dts文件。

/dts-v1/; / { compatible = "hd,test_dts", "hd,test_xxx"; #address-cells = ; #size-cells = ; model = "HD test dts"; chosen { stdout-path = "/ocp/serial@ffff"; }; memory@80000000 { device_type = "memory"; reg = ; }; led1:led@2000000 { compatible = "test_led"; #address-cells = ; #size-cells = ; reg = ; }; };

編譯當(dāng)前dts文件,獲取對(duì)應(yīng)的dtb文件。

鑒于dtb文件為二進(jìn)制文件,普通編輯器打開顯示亂碼,我們使用ultraEdit查看,它將數(shù)據(jù)以16進(jìn)制形式顯示:

wKgZomTUmW-AFGDEAAiLY7gzX50799.png

整個(gè)頭部為40字節(jié),16進(jìn)制為0x28,從頭部信息中off_mem_rsvmap部分可以得到,reservememory起始地址為0x28,上文中提到,這一部分使用一個(gè)16字節(jié)的struct來(lái)描述,以一個(gè)全為0的struct結(jié)尾。

后16字節(jié)全為0,可以看出,這里并沒有設(shè)置reservememory。

structure部分

上文回顧:每一個(gè)屬性都是以key=value的形式來(lái)描述,value部分可選。

偏移地址來(lái)到0x00000038(0x28+0x10),接下來(lái)8個(gè)字節(jié)為00000003,根據(jù)上述structure中的描述,這是OF_DT_PROP,即標(biāo)示屬性的開始。

接下來(lái)4字節(jié)為00000018,表明該屬性的value部分size為24字節(jié)。

接下來(lái)4字節(jié)是當(dāng)前屬性的key在string部分的偏移地址,這里是00000000,由頭部信息中off_dt_strings可以得到,string部分的開始為00000174,偏移地址為0,所以對(duì)應(yīng)字符串為"compatible"。

之后就是value部分,這部分的數(shù)據(jù)是字符串,可以直接從圖片右側(cè)欄看出,總共24字節(jié)的字符串"hd,test_dts","hd,test_xxx",因?yàn)樽址g以0結(jié)尾,所以程序可以識(shí)別出這是兩個(gè)字符串。

可以看出,到這里,compatible="hd,test_dts","hd,test_xxx";這個(gè)屬性就被描述完了,對(duì)于屬性的描述還是非常簡(jiǎn)單的。

按照固有的規(guī)律,接下來(lái)就是對(duì)#address-cells=<0x1>的解析,然后是#size-cells=<0x1>...

然后就是遞歸的子節(jié)點(diǎn)chosen,memory@80000000等等都是按照上文中提到的structure解析規(guī)則來(lái)進(jìn)行解析,最后以00000002結(jié)尾。

與根節(jié)點(diǎn)不同的是,子節(jié)點(diǎn)有一個(gè)unitname,即chosen,memory@80000000這些名稱,并非節(jié)點(diǎn)中的.name屬性。

而整個(gè)結(jié)構(gòu)的結(jié)束由00000009來(lái)描述。

一般而言,在32位系統(tǒng)中,dtc在編譯dts文件時(shí)會(huì)自動(dòng)考慮對(duì)齊問(wèn)題,所以對(duì)于設(shè)備樹的對(duì)齊字節(jié),我們只需要有所了解即可,并不會(huì)常接觸到。

文章來(lái)源:易百納技術(shù)社區(qū)

https://www.ebaina.com/articles/140000016352

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11230

    瀏覽量

    208934
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm32mp1-seeed-npi-full.dtb設(shè)備

    stm32mp1-seeed-npi-full.dtb這個(gè)設(shè)備。直接修改uEnv.txt文件,此文件會(huì)在uboot引導(dǎo)
    發(fā)表于 08-03 06:06

    linux設(shè)備詳解

    linux設(shè)備詳解 2003 年畢業(yè)于中國(guó)科學(xué)技術(shù)大學(xué),電子專業(yè)、軟件專業(yè)...
    發(fā)表于 12-23 08:16

    Linux內(nèi)核的設(shè)備DTS使用方法詳解

    dtb文件就是真正的設(shè)備;dts:一般情況下,一個(gè)dts代表公司的具體某一個(gè)產(chǎn)品,適用于同一套源碼內(nèi)適配不同的公司產(chǎn)品,而每次編譯的時(shí)候只編譯與該dts有關(guān)的信息。dtsi: dt
    發(fā)表于 05-06 16:14

    MP3 文件格式資料

    MP3 文件格式資料
    發(fā)表于 04-08 03:37 ?22次下載

    .mpp文件格式打開軟件下載

    .mpp文件格式打開
    發(fā)表于 07-07 13:14 ?2517次下載

    數(shù)碼相機(jī)伴侶的文件格式

    數(shù)碼相機(jī)伴侶的文件格式              文件格式指的是數(shù)碼相機(jī)伴侶獨(dú)特的文件系統(tǒng)結(jié)構(gòu)在
    發(fā)表于 12-23 10:05 ?861次閱讀

    GIF圖形文件格式文檔

    GIF圖形文件格式文檔 GIF圖形文件格式文檔 GIF圖形文件格式文檔
    發(fā)表于 05-24 10:53 ?2次下載

    GIF文件格式詳解

    GIF文件格式詳解 GIF文件格式詳解 GIF文件格式詳解
    發(fā)表于 05-24 10:53 ?2次下載

    編譯設(shè)備dts為dtb,制作根文件系統(tǒng)

    九、編譯設(shè)備dts為dtb 前面的linux內(nèi)核源碼目錄中已經(jīng)包含了設(shè)備編譯器Device
    發(fā)表于 02-08 16:59 ?2333次閱讀

    ZedBoard移植嵌入式Linux教程(4)

    ,也就是文本文件,便于閱讀,另外一種是dtb文件,是進(jìn)制格式,是dts使用dtc編譯器編譯而來(lái),由uboot展開并傳遞給
    發(fā)表于 02-09 03:06 ?630次閱讀
    ZedBoard移植嵌入式<b class='flag-5'>Linux</b>教程(4)

    Linux下可執(zhí)行文件格式

    Linux支持的可執(zhí)行文件主要有:Coff,elf,flat,類似Windows的.exeCoff文件格式? Common Object File Format,最早與uclinux
    發(fā)表于 04-02 14:46 ?1560次閱讀

    Linux設(shè)備原始dtb格式

    要的。 1、設(shè)備原始 dtb 格式 在如下目錄,fdt 就是我們的 設(shè)備*.
    的頭像 發(fā)表于 07-30 15:22 ?809次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>原始<b class='flag-5'>dtb</b><b class='flag-5'>格式</b>

    Linux設(shè)備目錄結(jié)構(gòu)dtb格式

    要的。 設(shè)備目錄結(jié)構(gòu) dtb 格式 /sys/firmware/devicetree 以目錄結(jié)構(gòu)程現(xiàn)的 dtb
    的頭像 發(fā)表于 07-30 15:25 ?756次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>樹</b>目錄結(jié)構(gòu)<b class='flag-5'>dtb</b><b class='flag-5'>格式</b>

    WAV文件格式詳解

    WAV是微軟公司開發(fā)的一種音頻格式文件,用于保存Windows平臺(tái)的音頻信息資源,它符合資源互換文件格式(Resource Interchange File Format,RIFF)文件規(guī)范。標(biāo)準(zhǔn)
    的頭像 發(fā)表于 10-21 09:52 ?5168次閱讀
    WAV<b class='flag-5'>文件格式</b><b class='flag-5'>詳解</b>

    常用對(duì)象文件格式

    電子發(fā)燒友網(wǎng)站提供《常用對(duì)象文件格式.pdf》資料免費(fèi)下載
    發(fā)表于 10-15 09:25 ?0次下載
    常用對(duì)象<b class='flag-5'>文件格式</b>