91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

深入理解設(shè)備樹chosen節(jié)點(diǎn):固件與內(nèi)核的“配置橋梁”

jf_44130326 ? 來源:Linux1024 ? 2026-02-09 16:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式Linux開發(fā)中,設(shè)備樹(Device Tree)是連接硬件與內(nèi)核的關(guān)鍵紐帶。但有一個節(jié)點(diǎn)很特殊——它不描述任何硬件模塊,卻直接決定內(nèi)核能否正常啟動,這就是chosen節(jié)點(diǎn)。

今天我們就從是什么、怎么工作、如何調(diào)試三個維度,結(jié)合流程圖腦圖,徹底搞懂chosen節(jié)點(diǎn)的核心邏輯,新手也能輕松入門。

一、chosen節(jié)點(diǎn):設(shè)備樹中的非硬件特殊存在

首先要明確一個關(guān)鍵點(diǎn):chosen節(jié)點(diǎn)的本質(zhì)是固件(如U-Boot)與內(nèi)核的配置傳遞通道,而非硬件描述節(jié)點(diǎn)。它的結(jié)構(gòu)和功能都圍繞傳遞啟動參數(shù)展開。

1.位置與結(jié)構(gòu):根節(jié)點(diǎn)下的扁平節(jié)點(diǎn)

chosen節(jié)點(diǎn)始終是設(shè)備樹根節(jié)點(diǎn)(/)的直接子節(jié)點(diǎn),路徑固定為/chosen,結(jié)構(gòu)極簡且無嵌套子節(jié)點(diǎn),典型定義如下:

/ {  chosen {    bootargs ="earlycon=uart8250,mmio32,0x2ad40000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";    stdout-path = &uart0;//指向串口設(shè)備節(jié)點(diǎn)  }; //其他硬件節(jié)點(diǎn)(描述CPU、外設(shè)等)  uart0: serial@2ad40000 { ... };  cpu0: cpu@0 { ... };};

?無子節(jié)點(diǎn):無需描述硬件層級,僅通過屬性=傳遞配置;

?位置固定:必須在根節(jié)點(diǎn)下,確保固件和內(nèi)核能快速定位。

2.核心屬性:傳遞啟動配置的鑰匙

chosen節(jié)點(diǎn)的核心是屬性,每個屬性都對應(yīng)內(nèi)核啟動的關(guān)鍵配置,最常用的4類屬性如下表所示:

屬性名

功能說明

典型值示例

優(yōu)先級

bootargs

內(nèi)核啟動參數(shù)集合(最核心)

"console=ttyFIQ0 root=PARTUUID=xxx"

最高(決定啟動核心邏輯)

stdout-path

標(biāo)準(zhǔn)輸出設(shè)備(控制臺)路徑

&uart0(指向串口節(jié)點(diǎn))

次高(補(bǔ)全控制臺配置)

linux,initrd-start

initrd(內(nèi)存盤)起始地址

0x88000000

按需使用(內(nèi)存盤場景)

linux,initrd-end

initrd(內(nèi)存盤)結(jié)束地址

0x89000000

按需使用(內(nèi)存盤場景)

其中bootargs是重中之重,它包含控制臺、根文件系統(tǒng)、權(quán)限等關(guān)鍵參數(shù),例如:

?earlycon=...:內(nèi)核初始化早期啟動串口輸出(捕獲早期日志);

?root=PARTUUID=xxx:通過分區(qū)UUID定位根文件系統(tǒng)(避免設(shè)備名變動);

?rw:根文件系統(tǒng)以可讀寫模式掛載。

3.與硬件節(jié)點(diǎn)的3大核心區(qū)別

很多開發(fā)者會混淆chosen節(jié)點(diǎn)與硬件節(jié)點(diǎn)(如uart0、cpu0),二者差異可通過下表快速區(qū)分:

對比維度

chosen節(jié)點(diǎn)

硬件節(jié)點(diǎn)(如uart0

核心作用

傳遞軟件配置

描述硬件特性(地址、中斷等)

可修改性

固件可動態(tài)修改(如U-Bootbootargs

靜態(tài)固定(由硬件手冊決定)

依賴關(guān)系

不依賴硬件驅(qū)動

需內(nèi)核驅(qū)動匹配才能生效

解析時機(jī)

內(nèi)核啟動最早期

驅(qū)動加載階段

二、固件視角:為內(nèi)核定制啟動配置(附流程圖)

固件(以最常用的U-Boot為例)是chosen節(jié)點(diǎn)的生產(chǎn)者,核心工作是根據(jù)硬件狀態(tài)和用戶需求,動態(tài)調(diào)整chosen配置,再傳遞給內(nèi)核。

固件處理chosen節(jié)點(diǎn)的完整流程

下圖清晰展示了U-Bootchosen節(jié)點(diǎn)的處理步驟,包含讀取-修改-傳遞三個核心環(huán)節(jié):

wKgZPGkaiwSAMh9eAANmrqVuwqo328.png

關(guān)鍵步驟解析

1.讀取靜態(tài)配置U-Boot先加載設(shè)備樹二進(jìn)制文件(.dtb),讀取.dts中預(yù)定義的bootargs、stdout-path等默認(rèn)值,相當(dāng)于讀取配置模板

2.動態(tài)修改屬性:這是最核心的一步,U-Boot會根據(jù)實(shí)際場景調(diào)整配置:

?若用戶在U-Boot命令行輸入setenv bootargs "xxx",則覆蓋chosen中的bootargs;

?若需加載initrd(內(nèi)存盤),則動態(tài)添加linux,initrd-startlinux,initrd-end屬性;

?stdout-path指向的串口不可用,則自動切換為可用設(shè)備(如從&uart0改為&uart1)。

1.傳遞設(shè)備樹:修改完成后,U-Boot通過架構(gòu)特定方式(如ARMr2寄存器)將.dtb地址傳遞給內(nèi)核,確保內(nèi)核能找到配置。

三、內(nèi)核視角:解析配置,啟動系統(tǒng)的第一指令(附流程圖)

內(nèi)核是chosen節(jié)點(diǎn)的消費(fèi)者,會在啟動最早期(甚至早于驅(qū)動加載)解析chosen節(jié)點(diǎn)——因?yàn)檫@直接關(guān)系到能否正常啟動

內(nèi)核處理chosen節(jié)點(diǎn)的完整流程

下圖展示了內(nèi)核從找到配置應(yīng)用配置的全流程,其中bootargs解析是核心環(huán)節(jié):

wKgZPGkaiwSAOpToAAFHwX3-tqw857.png

關(guān)鍵步驟解析

1.早期定位節(jié)點(diǎn):內(nèi)核啟動后第一步就是找到.dtb并定位/chosen節(jié)點(diǎn),這一步必須”——比如earlycon參數(shù)需要在串口驅(qū)動加載前生效,才能捕獲內(nèi)核初始化早期的日志。

2.bootargs解析與應(yīng)用bootargs是內(nèi)核啟動的總開關(guān),每個子參數(shù)都會交給對應(yīng)模塊處理:

?console=xxx:串口子系統(tǒng)初始化對應(yīng)終端(如/dev/ttyFIQ0),所有printk日志都輸出到這里;

?root=PARTUUID=xxxVFS(虛擬文件系統(tǒng))根據(jù)UUID找到根分區(qū),以rw模式掛載;

?rootwait:塊設(shè)備子系統(tǒng)等待存儲設(shè)備(如SD卡)就緒,避免掛載失敗。

1.暴露配置到用戶態(tài):內(nèi)核啟動后,會通過/proc/sys文件系統(tǒng)將chosen配置暴露給用戶,方便調(diào)試(如cat /proc/device-tree/chosen/bootargs可查看實(shí)際生效的啟動參數(shù))。

四、整體協(xié)作:固件與內(nèi)核的配置傳遞閉環(huán)


chosen節(jié)點(diǎn)的價值,本質(zhì)是實(shí)現(xiàn)了固件與內(nèi)核的信息閉環(huán)。

?信息是單向傳遞的:僅固件向內(nèi)核傳遞配置,內(nèi)核啟動后不反向修改;

?動態(tài)配置優(yōu)先級更高:U-Boot的動態(tài)修改(如用戶自定義bootargs)會覆蓋.dts的靜態(tài)配置;

?早期依賴強(qiáng):內(nèi)核必須先解析chosen節(jié)點(diǎn),才能完成控制臺、根文件系統(tǒng)等關(guān)鍵初始化。

五、實(shí)戰(zhàn)調(diào)試:3類常見問題與解決方案(附腦圖)

嵌入式開發(fā)中,很多啟動故障都與chosen節(jié)點(diǎn)相關(guān)。掌握以下調(diào)試方法,能快速定位問題:

chosen節(jié)點(diǎn)核心知識腦圖

先通過腦圖梳理調(diào)試所需的核心知識點(diǎn),方便快速查閱:

wKgZPGkaiwSAX0DTAAGzm4voDuE253.png

3類常見問題解決方案

1.問題1:控制臺無輸出

?可能原因:bootargsconsole參數(shù)錯誤,或stdout-path指向不可用設(shè)備;

?調(diào)試步驟:

i.執(zhí)行cat /proc/device-tree/chosen/bootargs,確認(rèn)console是否為正確終端(如ttyFIQ0);

ii.檢查stdout-path是否指向存在的串口節(jié)點(diǎn)(如&uart0是否在設(shè)備樹中定義);

iii.若需捕獲早期日志,確認(rèn)earlycon的串口地址(如0x2ad40000)與硬件手冊一致。

1.問題2:根文件系統(tǒng)掛載失敗

?可能原因:bootargsroot參數(shù)錯誤,或未加rootwait

?調(diào)試步驟:

i.確認(rèn)root參數(shù)類型(PARTUUID或設(shè)備名),用blkid命令驗(yàn)證PARTUUID是否匹配;

ii.若根文件系統(tǒng)在SD/ U盤,檢查是否添加rootwait參數(shù)(避免設(shè)備未就緒);

iii.查看內(nèi)核日志(dmesg | grep root),定位具體掛載失敗原因。

1.問題3:丟失內(nèi)核早期日志

?可能原因:未配置earlycon參數(shù),無法捕獲驅(qū)動加載前的日志;

?解決方案:在bootargs中添加earlycon=uart8250,mmio32,0x2ad40000(需替換為實(shí)際串口類型和地址)。

總結(jié):chosen節(jié)點(diǎn)的核心價值

chosen節(jié)點(diǎn)看似簡單,卻是嵌入式Linux啟動流程中的關(guān)鍵樞紐

?對固件而言,它是定制啟動配置的出口;

?對內(nèi)核而言,它是獲取啟動指令的入口;

?對開發(fā)者而言,它是排查啟動故障的重要抓手。

理解chosen節(jié)點(diǎn)的工作機(jī)制,不僅能快速解決啟動問題,更能深入掌握固件與內(nèi)核的協(xié)作邏輯——這也是嵌入式開發(fā)的核心能力之一。

你在開發(fā)中遇到過哪些與chosen節(jié)點(diǎn)相關(guān)的問題?歡迎在評論區(qū)分享,我們一起討論解決方案!

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

    關(guān)注

    5198

    文章

    20435

    瀏覽量

    333925
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1467

    瀏覽量

    42866
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218997
  • 設(shè)備樹
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    3572
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入理解Android

    深入理解Android
    發(fā)表于 08-20 15:30

    深入理解和實(shí)現(xiàn)RTOS_連載

    和trcohili的帖子。深入理解和實(shí)現(xiàn)RTOS_連載1_RTOS的前生今世今天發(fā)布的是第一篇,"RTOS的前生今世"。通過軟件系統(tǒng)結(jié)構(gòu)的比對簡要的介紹rtos為何而生。如果讀者對RTOS
    發(fā)表于 05-29 11:20

    深入理解和實(shí)現(xiàn)RTOS_連載

    和trcohili的帖子。trochili rtos完全是作者興趣所在,且行且堅持,比沒有duo。深入理解和實(shí)現(xiàn)RTOS_連載1_RTOS的前生今世今天發(fā)布的是第一篇,"RTOS的前生今世"
    發(fā)表于 05-30 01:02

    深入理解Linux內(nèi)核 中文版+英文原版

    深入理解Linux內(nèi)核 中文版+英文原版 經(jīng)典之作
    發(fā)表于 05-17 08:18

    深入理解lte-a

    深入理解LTE-A
    發(fā)表于 02-26 10:21

    linux設(shè)備中的chosen一項該怎么寫

    設(shè)備中的chosen節(jié)點(diǎn)會直接影響啟動的結(jié)果,但是不知道里邊的內(nèi)容與什么有關(guān)。參考別人的例子發(fā)現(xiàn)每個人寫的都不一樣,我也不知道該怎樣根據(jù)自己的工程去修改。有沒有大神知道?
    發(fā)表于 09-07 11:16

    深入理解STM32

    時鐘系統(tǒng)是處理器的核心,所以在學(xué)習(xí)STM32所有外設(shè)之前,認(rèn)真學(xué)習(xí)時鐘系統(tǒng)是必要的,有助于深入理解STM32。下面是從網(wǎng)上找的一個STM32時鐘框圖,比《STM32中文參考手冊》里面的是中途看起來清晰一些:重要的時鐘:PLLCLK,SYSCLK,HCKL,PCLK1,...
    發(fā)表于 08-12 07:46

    對棧的深入理解

    為什么要深入理解棧?做C語言開發(fā)如果棧設(shè)置不合理或者使用不對,棧就會溢出,溢出就會遇到無法預(yù)測亂飛現(xiàn)象。所以對棧的深入理解是非常重要的。注:動畫如果看不清楚可以電腦看更清晰啥是棧先來看一段動畫:沒有
    發(fā)表于 02-15 07:01

    為什么要深入理解

    [導(dǎo)讀] 從這篇文章開始,將會不定期更新關(guān)于嵌入式C語言編程相關(guān)的個人認(rèn)為比較重要的知識點(diǎn),或者踩過的坑。為什么要深入理解棧?做C語言開發(fā)如果棧設(shè)置不合理或者使用不對,棧就會溢出,溢出就會遇到無法
    發(fā)表于 02-15 06:09

    【米爾-TIAM62開發(fā)板-接替335x-試用評測】+(三)手把手創(chuàng)建Uboot設(shè)備內(nèi)核設(shè)備實(shí)戰(zhàn)

    配置信息生成的。 通過本周的學(xué)習(xí),我對設(shè)備有了更深入理解。我了解到它是一種強(qiáng)大的工具,可以讓我們更好地管理和控制嵌入式系統(tǒng)中的硬件
    發(fā)表于 11-28 09:54

    深入理解LINUX內(nèi)核(中文版)_ 陳莉君/馮銳/牛欣源譯

    電子發(fā)燒友網(wǎng)站提供《深入理解LINUX內(nèi)核(中文版)_ 陳莉君/馮銳/牛欣源譯.txt》資料免費(fèi)下載
    發(fā)表于 02-11 11:16 ?0次下載

    深入理解Android》文前

    深入理解Android》文前
    發(fā)表于 03-19 11:23 ?0次下載

    深入理解Android:卷I》

    深入理解Android:卷I》
    發(fā)表于 03-19 11:23 ?0次下載

    深入理解Android網(wǎng)絡(luò)編程

    深入理解Android網(wǎng)絡(luò)編程
    發(fā)表于 03-19 11:26 ?1次下載

    米爾科技深入理解LINUX內(nèi)核簡介

    為了透徹理解Linux的工作機(jī)理,以及為何它在各種系統(tǒng)上能順暢運(yùn)行,你需要深入內(nèi)核的心臟。
    的頭像 發(fā)表于 11-25 09:34 ?2381次閱讀
    米爾科技<b class='flag-5'>深入理解</b>LINUX<b class='flag-5'>內(nèi)核</b>簡介