日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

chosen節(jié)點(diǎn)始終是設(shè)備樹(shù)根節(jié)點(diǎn)(/)的直接子節(jié)點(diǎn),路徑固定為/chosen,結(jié)構(gòu)極簡(jiǎn)且無(wú)嵌套子節(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 { ... };};

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

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

2.核心屬性:傳遞啟動(dòng)配置的鑰匙

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

屬性名

功能說(shuō)明

典型值示例

優(yōu)先級(jí)

bootargs

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

"console=ttyFIQ0 root=PARTUUID=xxx"

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

stdout-path

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

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

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

linux,initrd-start

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

0x88000000

按需使用(內(nèi)存盤(pán)場(chǎng)景)

linux,initrd-end

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

0x89000000

按需使用(內(nèi)存盤(pán)場(chǎng)景)

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

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

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

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

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

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

對(duì)比維度

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

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

核心作用

傳遞軟件配置

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

可修改性

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

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

依賴關(guān)系

不依賴硬件驅(qū)動(dòng)

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

解析時(shí)機(jī)

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

驅(qū)動(dòng)加載階段

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

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

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

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

wKgZPGkaiwSAMh9eAANmrqVuwqo328.png

關(guān)鍵步驟解析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

wKgZPGkaiwSAX0DTAAGzm4voDuE253.png

3類(lèi)常見(jiàn)問(wèn)題解決方案

1.問(wèn)題1:控制臺(tái)無(wú)輸出

?可能原因:bootargsconsole參數(shù)錯(cuò)誤,或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è)備樹(shù)中定義);

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

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

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

?調(diào)試步驟:

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

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

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

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

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

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

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

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

?對(duì)固件而言,它是定制啟動(dòng)配置的出口;

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

?對(duì)開(kāi)發(fā)者而言,它是排查啟動(dòng)故障的重要抓手。

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5209

    文章

    20679

    瀏覽量

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

    關(guān)注

    4

    文章

    1476

    瀏覽量

    43098
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11821

    瀏覽量

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

    關(guān)注

    0

    文章

    45

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    深入理解Android

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

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

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

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

    和trcohili的帖子。trochili rtos完全是作者興趣所在,且行且堅(jiān)持,比沒(méi)有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è)備樹(shù)中的chosen一項(xiàng)該怎么寫(xiě)

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

    深入理解STM32

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

    對(duì)棧的深入理解

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

    為什么要深入理解

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

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

    配置信息生成的。 通過(guò)本周的學(xué)習(xí),我對(duì)設(shè)備樹(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)核簡(jiǎn)介

    為了透徹理解Linux的工作機(jī)理,以及為何它在各種系統(tǒng)上能順暢運(yùn)行,你需要深入內(nèi)核的心臟。
    的頭像 發(fā)表于 11-25 09:34 ?2522次閱讀
    米爾科技<b class='flag-5'>深入理解</b>LINUX<b class='flag-5'>內(nèi)核</b>簡(jiǎn)介
    财经| 台山市| 肥城市| 黄山市| 金阳县| 梅州市| 武汉市| 宁乡县| 巴彦县| 三原县| 安阳县| 宁晋县| 平邑县| 麻江县| 大庆市| 西峡县| 澄城县| 长阳| 榆树市| 应城市| 德江县| 湘潭县| 德保县| 凤冈县| 永登县| 合作市| 易门县| 景洪市| 中山市| 正阳县| 饶河县| 三江| 蓬安县| 安溪县| 鸡东县| 苍溪县| 和林格尔县| 廊坊市| 濮阳县| 类乌齐县| 宁南县|