Re: [問題] uboot的開機順序

看板LinuxDev作者 (京都念慈庵,賈詡念費翔)時間10年前 (2014/10/13 17:05), 10年前編輯推噓2(205)
留言7則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《zelkova (*〞︶〝*)》之銘言: : 最近在自修uboot開機流程 : google看過一些資料之後 我的理解是這樣 : 1. 上電之後 : cpu會到flash或rom位置0x0(看cpu腳位設定), 複製uboot程序到ram中 : 2. uboot拷貝完成後 : 進行driver跟memory的初始化(暫存器), 以及設備的基本測試(看功能是不是正常) : 3. uboot對裝置初始化完成之後 : uboot會對軟硬體的環境變數進行設置, 最後執行bootm去載入kernel, 離開uboot : 身邊沒有人可以討論 : 想請各位前輩確認我的理解是不是正確的 謝謝 簡略解說,其實開機方式有很多種, 暫時就依你所認知的作補充,板上強者很多,如有訛誤請不吝指教~ 開機之前先區分一下軟硬體部分,通常如下: HW: 1)SOC(CPU+SRAM) 2)DRAM(SD,DDR或LPDDR等等) 3)其他周邊(UART,LCD等) SW: 1)OBL(Original Bootloader? On-chip Bootloader?也有人說RomCode, 認知上是寫死在SOC內部的最早loader,也有聽說過用硬體實現的) 2)U-Boot(其實不一定只能用uboot,也有其他各有特色的bootloader可使用, 只要你會porting) 3)kernel(uImage,zImage等,有時候還會有個rootfs, 沒有的話可能是用ramdisk方式與kernel image綁在一起) 我使用過的平台來說 SRAM是內建的,開機通常不需要初始化,可直接存取,容量很小(64KB,128KB,256KB等) DRAM通常是外掛,需要初始化(通常是MB等級,64MB,128MB...等,要幾G有幾G, 老闆和HW同事說了算XD) 依據你的理解 CPU本身只會預設到最開始的位置0去跑(這要參閱各SOC datasheet) 通常那邊會安排OBL存放 OBL跑起來(XIP,儲存媒體可能是NOR flash在SOC) 去NAND或是SD卡(取決於硬體jumper設定--如果有的話)找第一block或是u-boot檔名 把資料load到SRAM上面去 接著PC(program counter)跳過去開始U-boot執行, 通常會作下面幾件事情 1. CPU/Clock init:設定CPU倍頻,clock來源(內部震盪或是外部等等),倍率等 2. DRAM init: 設定DRAM特性 (例:填SOC register告訴Dram Interface你的DRam是CL幾? 有無支援Burst mode?要不要slow slew rate?) 3. UART colsole init:至少debug用的UART要會動才能對U-boot下command 4. bootargs: 設定好kernel開機所需要用到的環境變數 5. loading kernel:把zImage或uImage從NAND或是SD撈出來, 放在啟動的DRam上面,驗證image合法後才把PC跳過去 driver的初始化,其實每個階段都會作 OBL如果要UART console秀字,內建就會順便初始UART(其實是直接填register) U-boot因為本身的泛用性 基本上自己要有UART driver去初始console, 但也有人要用tftpboot,要用到網路,U-boot就需自帶net PHY的driver 也有人要在U-boot階段就點亮LCD,就需要自帶LCD driver 但最重要的是CPU以及DRAM的初始化 而以上其他周邊的driver, 在kernel啟動之後,一樣會重掛driver(LCD,UART,NAND,SD卡等) 至於CPU跟DRAM的初始倒是不會再動了 (本體在DRAM上面再去init DRAM-->雞蛋的問題?) 我知道比較新的硬體以及kernel版本有支援動態變頻,這方面的知識我沒有,抱歉了~ 對了,為什麼說順著你的理解講呢? 目前我所知道的流程有以下幾種 OBL-->U-boot-->kernel OBL-->MLO-->U-boot-->kernel (Linaro好像是這樣的?) OBL-->OBL2-->U-boot-->kernel (有的U-boot還有分身) OBL-->OBL2-->kernel 等等等...取決於硬體限制以及軟體支援度 這邊只分享開機而已 這東西是一翻兩瞪眼,(開機vs無法開機) 更重要的事情是在開機之後所要作的事情, 如有錯誤還請各位大大開示了! Orz -- 明月幾時有?把青天,不知天上宮闕,今夕是何年? 我欲乘歸去,惟恐瓊樓玉宇,高處不勝; 起舞弄清影,何似在人間。朱閣,低綺戶無眠。不應有,何事長向別時圓? ,此事古難全。 但願人長久,千里共嬋娟。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.230.97.154 ※ 文章網址: http://www.ptt.cc/bbs/LinuxDev/M.1413191147.A.F28.html ※ 編輯: drag (61.230.97.154), 10/13/2014 17:08:54

10/13 21:43, , 1F
感謝drag大大的分享 很受用 之後會找板子來玩玩看<(_ _)>
10/13 21:43, 1F

10/13 23:30, , 2F
MLO好處是夠小,chip內的bootcode 不用花太多搬他
10/13 23:30, 2F

10/13 23:31, , 3F
因為這個階段的bootcode能用的資源很有限,像我用過的SOC
10/13 23:31, 3F

10/13 23:32, , 4F
TI在這個階段只能用1bit mode去讀SD卡,有些chip甚至
10/13 23:32, 4F

10/13 23:33, , 5F
甚至只能讀資料到register,縮小第一階段的bootloader
10/13 23:33, 5F

10/13 23:34, , 6F
就有很多好處了~
10/13 23:34, 6F

10/14 16:58, , 7F
通常MLO主要作CPU/DRAM init,這取決於u-boot放在哪,能放多大
10/14 16:58, 7F
文章代碼(AID): #1KEvNhye (LinuxDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1KEvNhye (LinuxDev)