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

歡迎訪問 生活随笔!

生活随笔

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

linux

我眼中的Linux设备树(一 概述)

發(fā)布時間:2025/4/16 linux 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我眼中的Linux设备树(一 概述) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一 概述

設(shè)備樹(Device tree)是一套用來描述硬件屬相的規(guī)則。ARM Linux采用設(shè)備樹機制源于2011年3月份Linux創(chuàng)始人Linus Torvalds發(fā)的一封郵件,在這封郵件中他提倡ARM平臺應(yīng)該參考其他平臺如PowerPC的設(shè)備樹機制描述硬件。因為在此之前,ARM平臺還是采用舊的機制,在kernel/arch/arm/plat-xxx目錄和kernel/arch/arm/mach-xxx目錄下用代碼描述硬件,如注冊platform設(shè)備,聲明設(shè)備的resource等。因為這些代碼都是用來描述芯片平臺及板級差異的,所以對于內(nèi)核來講都是垃圾代碼。因為嵌入式平臺中很多公司的芯片采用的都是ARM架構(gòu),隨著Android的成功,這些代碼越來越多。據(jù)說常見的平臺如s3c2410板級目錄下邊的代碼有數(shù)萬行,難怪Linux Torvalds會說“this whole ARM thing is a fucking pain in the ass”。

內(nèi)核中關(guān)于設(shè)備樹的文檔位于kernel/Documentation/devicetree/目錄。設(shè)備樹是Power.org組織定義的一套規(guī)范,規(guī)范文檔可以在官網(wǎng)上找到,目前最新的版本是https://www.power.org/documentation/epapr-version-1-1/。內(nèi)核中設(shè)備樹相關(guān)的函數(shù)都是以of開頭的,我推測原因是設(shè)備樹機制是源于IEEE 1275 Open Firmware standard規(guī)范的,相關(guān)的代碼都是繼承下來的。如果想快速了解下設(shè)備樹怎么用,可以參考http://devicetree.org/Device_Tree_Usage。

設(shè)備樹是從軟件使用的角度描述硬件的,不是從硬件設(shè)計的角度描述的。我們在寫設(shè)備樹時沒有必要按照硬件邏輯生搬硬套,也不要指望通過閱讀設(shè)備樹弄清楚硬件是如何設(shè)計的。對于軟件可以自動識別的硬件,如USB設(shè)備,PCI設(shè)備,也是沒有必要通過設(shè)備樹描述的。

我個人覺得規(guī)范內(nèi)容是可以分為兩個層次的。第一層是關(guān)于設(shè)備樹組織形式的,如設(shè)備樹結(jié)構(gòu),節(jié)點名字的構(gòu)成等,第一個層次是基礎(chǔ),是理解第二個層次的前提。第二層是關(guān)于設(shè)備樹內(nèi)容的,如多核CPU怎樣描述,一個具體的設(shè)備如何描述。第二層可以看成是第一層的具體應(yīng)用。相對來說第二層內(nèi)容更多,更具體,根據(jù)描述的內(nèi)容不同,定義規(guī)范的方式也有差別,比如關(guān)于CPU,內(nèi)存,中斷這些基礎(chǔ)的內(nèi)容,是在epapr中說明的,而關(guān)于外設(shè)的規(guī)范是在專門的地方說明的。

DTS(Device tree syntax,另一種說法是Device tree source)是設(shè)備樹源文件,為了方便閱讀及修改,采用文本格式。DTC(Device tree compiler)是一個小工具,負責將DTS轉(zhuǎn)換成DTB(Device tree blob)。DTB是DTS的二進制形式,供機器使用。使用中,我們首先根據(jù)硬件修改DTS文件,然后在編譯的時候通過DTC工具將DTS文件轉(zhuǎn)換成DTB文件,然后將DTB文件燒寫到機器上(如emmc,磁盤等存儲介質(zhì))。系統(tǒng)啟動時,fastboot(或者類似的啟動程序,如Uboot)在啟動內(nèi)核前將DTB文件讀到內(nèi)存中,跳轉(zhuǎn)到內(nèi)核執(zhí)行的同時將DTB起始地址傳給內(nèi)核。內(nèi)核通過起始地址就可以根據(jù)DTB的結(jié)構(gòu)解析整個設(shè)備樹。說設(shè)備樹的規(guī)范可以分成兩個層次,是針對DTS的,關(guān)于DTB的結(jié)構(gòu)不在此范圍內(nèi)。DTB僅僅是為了方便機器使用而對DTS的轉(zhuǎn)換而已(也可以說DTS僅是為了方便人類使用而對DTB的一種描述)。

設(shè)備樹首先是一個樹形結(jié)構(gòu),并且是一棵樹。除了根節(jié)點外其他子節(jié)點都有唯一的父節(jié)點,節(jié)點下可以有子節(jié)點和屬性(子節(jié)點可以看成是樹枝,屬性可以看成是葉子)。屬性由名字和值組成(名字是必須的,但是值不是必須的,如果只要根據(jù)是否存在這個屬性就可以表示我們想要的功能,那么可以不需要有值)。

下邊是我們從內(nèi)核代碼中截取的一個DTS片段。“/”表示根節(jié)點。“model = "Newflow AM335x NanoBone"”是根節(jié)點下邊的屬性。“cpus”是根節(jié)點的一個子節(jié)點。“cpu0-supply = <&dcdc2_reg>”是“cpu@0”子節(jié)點下的屬性。節(jié)點下的屬性用來表示節(jié)點的特性,子節(jié)點和父節(jié)點具有一定的從屬關(guān)系。真實的硬件不可能是這樣規(guī)則的樹形結(jié)構(gòu),所以設(shè)備樹僅是軟件開發(fā)人員為了描述硬件而做的一個近似表示而已,連抽象都算不上。

/ {
?? ?model = "Newflow AM335x NanoBone";
?? ?compatible = "ti,am33xx";

?? ?cpus {
?? ??? ?cpu@0 {
?? ??? ??? ?cpu0-supply = <&dcdc2_reg>;
?? ??? ?};
?? ?};

?? ?memory {
?? ??? ?device_type = "memory";
?? ??? ?reg = <0x80000000 0x10000000>; /* 256 MB */
?? ?};

?? ?leds {
?? ??? ?compatible = "gpio-leds";

?? ??? ?led@0 {
?? ??? ??? ?label = "nanobone:green:usr1";
?? ??? ??? ?gpios = <&gpio1 5 0>;
?? ??? ??? ?default-state = "off";
?? ??? ?};
?? ?};
};

總結(jié)

以上是生活随笔為你收集整理的我眼中的Linux设备树(一 概述)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。