聊聊Linux 運(yùn)行時設(shè)備樹
在根文件系統(tǒng)中查看設(shè)備樹,是一種不錯的調(diào)試手段。因?yàn)楹芏鄷r候會出現(xiàn)你修改了 dts 文件,并且也編譯了新的 dtb,但是下載到板子上的還是以前的 dtb,因此查看板子中真實(shí)生效的設(shè)備樹配置信息是很重要的。
1、設(shè)備樹原始 dtb 格式
在如下目錄,fdt 就是我們的 設(shè)備樹*.dtb文件
/sys/firmware/fdt //原始dtb文件
執(zhí)行以下指令可看
hexdump -C /sys/firmware/fdt
這個命令打開后是十六進(jìn)制模式,如圖:
這樣是很難看到真實(shí)配置的,可以把 fdt 弄出來,放到 ubuntu 中,使用 Linux 源碼自帶的 DTC 工具反編譯,查看真實(shí)的配置。反編譯命令為
/script/dtc/dtc -I dtb -O dts -o xxx.dts xxx.dtb
DTS 是設(shè)備樹源碼文件,DTB 是將 DTS 編譯以后得到的二進(jìn)制文件。將 .c 文件編譯為 .o 需要用到 gcc 編譯器,那么將.dts 編譯為.dtb 需要什么工具呢?需要用到 DTC 工具!反編譯也是這個工具,反編譯后可以看到方便查看的設(shè)備樹,字符串會恢復(fù),數(shù)字會變成十六進(jìn)制格式。
在 u-boot 啟動內(nèi)核時,會將 dtb 文件的內(nèi)存地址傳遞給內(nèi)核,并將其所占內(nèi)存保留;因此,我們在內(nèi)核啟動后,訪問該內(nèi)存,獲得原始的 dtb。
2、設(shè)備樹目錄結(jié)構(gòu) dtb 格式
/sys/firmware/devicetree
以目錄結(jié)構(gòu)程現(xiàn)的 dtb 文件, 根節(jié)點(diǎn)對應(yīng) base 目錄, 每一個節(jié)點(diǎn)對應(yīng)一個目錄, 每一個屬性對應(yīng)一個文件:
在這里你就可以看到你配置的設(shè)備樹節(jié)點(diǎn)信息,字符串使用 cat,數(shù)字使用 xxd 、hexdump 命令:
3、內(nèi)核中現(xiàn)存的所有 platform_device
/sys/devices/platform
系統(tǒng)中所有的 platform_device, 有來自設(shè)備樹的, 也有來有 .c 文件中注冊的。
對于來自設(shè)備樹的 platform_device,可以進(jìn)入 /sys/devices/platform/<設(shè)備名>/of_node 查看它的設(shè)備樹屬性。
對于有 of_node 屬性的 platform_device,證明其來源于 dtb。
note:/proc/device-tree 是鏈接文件, 指向 /sys/firmware/devicetree/base
以上是 Linux 原生的節(jié)點(diǎn),可以供我們使用。如果你用的芯片是某個廠家,這個廠家客制化的時候會增加一些調(diào)試節(jié)點(diǎn),你可以很方便的在 IC 廠商增加的調(diào)試節(jié)點(diǎn)中查看設(shè)備樹信息。
重要補(bǔ)充:
Linux 常用的文件系統(tǒng)有三個:procfs、sysfs、debugfs
procfs:該文件系統(tǒng)主要用來反饋內(nèi)核的信息,包括系統(tǒng)中所有的中斷、進(jìn)程信息都可以在這里查看。掛載在 /proc/...
sysfs:該文件系統(tǒng)主要是和驅(qū)動強(qiáng)相關(guān),會反饋所有的驅(qū)動信息,以目錄形式顯示。掛載在 /sys/...
debugfs:該文件系統(tǒng)掛載在 /sys/kernel/debug/... ,主要用來 debug。