Ads 468x60px

##EasyReadMore##

23 5月, 2016

【整理】BIOS、BootLoader、uboot對比

簡單說就是 BIOS、BootLoader for Intel
uboot for 非 Intel

bios
BIOS是英文"Basic Input Output System"的縮略語,直譯過來後中文名稱就是"基本輸入輸出系統"。其實,它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存著計算機最重要的基本輸入輸出的程序、系統設置信息、開機後自檢程序和系統自啟動程序。 其主要功能是為計算機提供最底層的、最直接的硬件設置和控制。


BootLoader
BootLoader是一段小程序,可以把它想像成PC機linux上的GRUB/LILO引導程序,只不過在嵌入式linux中,沒有BIOS,而是直接從flash中運行,來裝載內核。它可以初始化硬件設備,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統做好準備。

一個嵌入式系統從軟件角度來看分為三個層次:
1.引導加載程序
包括固化在固化中的boot程序(可選),和BootLoader兩大部分
2.linux內核
特定於嵌入式平台的定制內核
3.文件系統
包括了系統命令和應用程序
--------------------------------------------------------------------------------
 BootLoader-->Boot Parameters-->Kernel-->Root Filesystem
--------------------------------------------------------------------------------
為什麼需要進行bootloader移植?
答:1.因為每種不同的CPU體系結構都有不同的BootLoader
2.BootLoader依賴於具體的嵌入式板級設備的配置
--------------------------------------------------------------------------------
BootLoader啟動過程可分為單階段和多階段(stage1、stage2),其中stage1完成初始化硬件,如CPU寄存器、內存控制器,為stage2準備內存空間。一般stage1是可以直接在nor flash中運行的,並將stage2複製到內存RAM中,設置堆棧,然後跳轉到stage2(從這也可以看出stage2是在RAM中運行的,與stage1不同)

BootLoader的stage1通常包括以下步驟:
1.硬件設備初始化  如CPU寄存器、內存控制器
2.為加載BootLoader的stage2準備RAM空間
3.拷貝BootLoader的stage2到RAM空間中
4.設置好堆棧    為什麼?為了跳轉到stage2的入口,因為stage2大多數是用C語言寫的
5.跳轉到stage2的C入口點

BootLoader的stage2通常包括以下步驟:
1.初始化本階段要使用到的硬件設備    各種設備,如網卡
2.將內核映像和根文件系統映像從flash上讀到RAM中去
3.調用內核

  1. 載入 BIOS 的硬體資訊與進行自我測試,並依據設定取得第一個可開機的裝置;
  2. 讀取並執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub2, spfdisk 等程式);
  3. 依據 boot loader 的設定載入 Kernel ,Kernel 會開始偵測硬體與載入驅動程式;
  4. 在硬體驅動成功後,Kernel 會主動呼叫 systemd 程式,並以 default.target 流程開機;






虛擬檔案系統 (Initial RAM Disk 或 Initial RAM Filesystem) 一般使用的檔名為 /boot/initrd 或 /boot/initramfs ,這個檔案的特色是,他也能夠透過 boot loader 來載入到記憶體中,然後這個檔案會被解壓縮並且在記憶體當中模擬成一個根目錄, 且此模擬在記憶體當中的檔案系統能夠提供一支可執行的程式,透過該程式來載入開機過程中所最需要的核心模組, 通常這些模組就是 USB, RAID, LVM, SCSI 等檔案系統與磁碟介面的驅動程式啦!等載入完成後, 會幫助核心重新呼叫 systemd 來開始後續的正常開機流程。




--------------------------------------------------------------------------------


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無法開機)
更重要的事情是在開機之後所要作的事情,
Uboot用於多種嵌入式CPU的BootLoader程序
可以支援多種不同的計算機系統結構,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios與MicroBlaze。
支持多種嵌入式操作系統的引導
UBOOT目錄結構
1.Borad        與開發板有關的文件。第一個開發板都以一個子目錄出現在當前目錄中
2.Common    實現Uboot支持的命令
3.Cpu        與特定CPU架構相關的代碼,支持的CPU對應一個子目錄(注意CPU與開發板的區別)
3.Disk        對磁盤的支持
4.Doc        文檔目錄
5.Drivers    Uboot支持的設備驅動程序  如各種網卡、串品、USB、支持CFI的Flash
6.Fs         文件系統的支持
7.Iclude    Uboot使用的頭文件。該目錄下configs目錄有與開發板相關的配置頭文件        該目錄下的asm目錄有與CPU體系結構相關的頭文件
8.Net        與網絡協議相關的代碼    各路協議的實現
9.Tools        生成Uboot的工具,如:mkimage,crc等等

Uboot編譯分為兩步
1.執行每種board相關的配置    如:make amdk_2420
2.編譯生成uboot.bin文件        如:make CROSS_COMPILE=arm-linux-(指定正確路徑)
--------------------------------------------------------------------------------

UBOOT基於單板機提供了豐富的命令集操作
UBOOT命令
printenv查看環境變量(相當全局變量?)
setenv 添加、修改、刪除環境變量
1.setenv name value
set environment variable 'name' to 'value...'
2.setenv name
delete environment variable 'name'
saveenv保存環境變量
將當前定義的所有變量及其值存入flash中
--------------------------------------------------------------------------------
---------------------文件下載------------------------------------
tftp 通過網絡下載文件     使用前,配置好網絡
配置網絡:1.setenv ethaddr 12:34:56:78:8A:BC
2.setenv ipaddr 192.168.1.1
3.setenv serverip 192.168.1.254  (tftp服務器的地址)
連接下載:tftp 32000000 uImage
把server(IP=環境變量中設置的serverip)服務目錄下的uImage通過tftp讀入到0x32000000處

md 顯示內存區的內容
md[.b,.w,.l]address    如:md.w 1000000

mm[.b,.w,.l]address    如:mm.w 100000
mm 修改內存,地址自動遞增    提供了一種互動修改存儲器內容的方法,如果沒有輸入任何值,按回車內容保持不變,輸入空格然後按下回車,結束輸入

flinfo    查看Flash扇區信息
--------------------------------------------------------------------------------
protect Flash寫保護  打開或關閉扇區寫保護
用法:
protect off all        關閉所有扇區的寫保護
protect on all         打開所有扇區的寫保護
protect off start end     關閉從start到end扇區的寫保護-----》protect off 0 1ffff(前一扇區減去1?)
protect on start end     打開從start到end扇區的寫保護

--------------------------------------------------------------------------------

erase 擦除flash扇區
用法: erase start end    如: erase 30000 1efff
在使用cp命令向Nor型Flash寫入數據之前必須先使用erase命令擦除flash

cp 數據拷貝
cp [.b,.w,.l]saddress daddress len
cp提供了一種內存與內存,內存與Flash之間數據拷貝的方法
如:cp.b 31000000 50000 d0000 即是將內存地址0x31000000處的數據(長度為0xd0000)拷貝到地址0x50000處(Flash中)

--------------------------------------------------------------------------------
執行程序
go 執行內存中的二進制代碼,一個簡單的跳轉到指定地址
go addr[arg...]
start application at address 'addr',
passing 'arg' as arguments

bootm 執行內存中的二進制代碼
bootm [addr[arg...]]       要求二進制代碼有固定格式的文件頭
boot application image stored in memory passing arguments 'arg...';
when booting a Linux kernel,'arg' can be the address of an initrd image
bdinfo    顯示開發板信息  (可用於啟動linux內核)
bdinfo命令將在終端顯示諸如內存地址和大小、時鐘頻率、MAC地址等信息
這些信息在傳遞給LIUNX內核一些參數時可能會用到

設置自動啟動
setenv bootcmd tftp 31000000 uImage \;bootm 31000000
saveenv

0 意見:

張貼留言

 
Blogger Templates