引言:本文簡(jiǎn)明扼要的介紹了嵌入式Linux的引導過(guò)程,X86體系的引導過(guò)程以及幾種常見(jiàn)嵌入式處理器的引導過(guò)程,U-Boot的移植的基本步驟、常用命令如何使用。通過(guò)本文可以對嵌入式Linux的引導從概念到實(shí)際操作有一個(gè)總體清晰的認識
1.啟動(dòng)順序
1.1 Bootloader
Bootloader(引導加載程序)本質(zhì)上是一小段程序,其基本功能在于:
基本的硬件初始化
從閃存存儲,網(wǎng)絡(luò )或其他類(lèi)型的非易失性存儲中加載應用程序二進(jìn)制文件(通常是操作系統內核)。
可能會(huì )對應用程序二進(jìn)制文件進(jìn)行解壓縮
執行申請
除此基本功能之外,大多數Bootloader(引導加載程序)實(shí)現了Shell命令集以執行不同操作。
從存儲或網(wǎng)絡(luò )中加載數據,內存檢查,硬件診斷和測試等
1.2 基于BIOS-X86的引導
x86處理器通常安裝在在一塊包含BIOS程序的非易失性存儲器主板上。
在基于BIOS的舊x86平臺上:BIOS負責基本的硬件初始化和從非易失性存儲中加載一小段代碼。
這段代碼通常是第一階段的引導程序bootloader,它將加載完整的引導程序bootloader本身。
bootloader可以解析文件系統,因此內核映象可以直接從普通文件系統中加載。
此順序與現代基于EFI的系統不同。
用于X86體系Linux的bootloader常用的有以下兩種:
GNU GRUB(GRand UnifiedBootloader簡(jiǎn)稱(chēng)“GRUB”)是一個(gè)來(lái)自GNU項目的多操作系統啟動(dòng)程序。GRUB是多啟動(dòng)規范的實(shí)現,它允許用戶(hù)可以在計算機內同時(shí)擁有多個(gè)操作系統,并在計算機啟動(dòng)時(shí)選擇希望運行的操作系統。GRUB可用于選擇操作系統分區上的不同內核,也可用于向這些內核傳遞啟動(dòng)參數。
在X86架構的機器中,Linux、BSD 或其它Unix類(lèi)的操作系統中GRUB、LILO 是大家最為常用,應該說(shuō)是主流。
詳細信息請參考:http://www.gnu.org/software/grub/
syslinux是一個(gè)功能強大的引導加載程序,而且兼容各種介質(zhì)。它的目的是簡(jiǎn)化首次安裝Linux的時(shí)間,并建立修護或其它特殊用途的啟動(dòng)盤(pán)。它的安裝很簡(jiǎn)單,一旦安裝syslinux好之后,sysLinux啟動(dòng)盤(pán)就可以引導各種基于DOS的工具,以及MS-DOS/Windows或者任何其它操作系統。不僅支持采用BIOS結構的主板,而且從6.0版也開(kāi)始支持采用EFI結構的新型主板。
Syslinux常被用于自網(wǎng)絡(luò )或者可移動(dòng)存儲介質(zhì)(如USB/CD-ROM)引導 Linux
詳細信息請參考:https://kernel.org/pub/linux/utils/boot/syslinux/
1.3 嵌入式CPU的引導
Case 1:CPU內部無(wú)引導代碼
CPU上電后,CPU開(kāi)始在固定地址入口執行代碼
CPU沒(méi)有提供其他引導機制
硬件設計必須確保已連接存儲芯片(如NOR閃存芯片)這樣就可以在CPU啟動(dòng)的地址訪(fǎng)問(wèn)它并執行指令
第一級引導程序必須在此地址編程在該存儲芯片中(如NOR)
NOR是強制性的,因為它允許隨機訪(fǎng)問(wèn),NAND不允許
注:這種方案已不常用,因為需要NOR FLASH
Case2:CPU內具有引導代碼
CPU在ROM中具有集成的引導代碼。如:AT91 CPU上的BootROM,OMAP上的“ ROM代碼”,等等。具體細節取決于CPU體系結構
此引導代碼能夠將第一級引導加載程序從存儲設備加載到內部SRAM(因為DRAM尚未初始化)。 存儲設備通??梢允牵篗MC,NAND,SPI閃存,UART(通過(guò)串行線(xiàn)傳輸數據)等等。
第一階段的引導程序: 由于硬件限制,尺寸有限(SRAM比較貴), 由CPU供應商或社區項目提供
此第一階段引導程序必須初始化DRAM和其他硬件設備,并將第二階段的引導程序加載到RAM
因為本文專(zhuān)注嵌入式領(lǐng)域,故接下來(lái)將描述幾種常見(jiàn)的嵌入式處理器的引導過(guò)程。
RomBoot:嘗試從各種設備中找到有效的引導映像存儲源,然后將其加載到SRAM中(DRAM還未初始化)。大小限制為4 KB,無(wú)法進(jìn)行用戶(hù)互動(dòng)標準啟動(dòng)模式。
AT91Bootstrap:從SRAM運行。初始化DRAM,NAND或SPI控制器,并將輔助引導程序加載到RAM并啟動(dòng)它,此階段沒(méi)有用戶(hù)互動(dòng)的可能。
U-Boot:從RAM運行。初始化其他一些硬件設備(網(wǎng)絡(luò ),USB等)。從存儲或加載內核映像網(wǎng)絡(luò )到RAM并啟動(dòng)它。此階段Shell命令可以使用。
Linux內核:從RAM運行。完全接管系統(引導加載程序bootloader不再存在)。
1.2.2 ARM TI OMAP2+/AM33xx的引導
ROM代碼:嘗試從各種方法中找到有效的引導映像存儲源,并將其加載到SRAM或RAM中(RAM可以是由ROM代碼通過(guò)配置標頭初始化)。尺寸限制為《64 KB。沒(méi)有用戶(hù)互動(dòng)的可能。
X-Loader或U-Boot SPL:從SRAM運行。初始化DRAM,NAND或MMC控制器,并加載輔助將引導程序加載到RAM中并啟動(dòng)它。沒(méi)有用戶(hù)互動(dòng)的可能。文件名為MLO。
U-Boot:從RAM運行。初始化其他一些硬件設備(網(wǎng)絡(luò ),USB等)。從存儲或加載內核映像網(wǎng)絡(luò )到RAM并啟動(dòng)它。具有提供的命令的Shell。該文件一般名為u-boot.bin或u-boot.img。
Linux內核:從RAM運行。完全接管系統(引導程序不再存在)。
1.2.3 MarvellSoCs 的引導
ROM代碼:嘗試從各種方法中找到有效的引導影像
存儲源,并將其加載到RAM中。RAM配置為在特定于CPU的標頭中進(jìn)行了描述,該標頭已添加到引導加載程序中圖片。
U-Boot:從RAM運行。初始化其他一些硬件設備(網(wǎng)絡(luò ),USB等)。從存儲或加載內核映像網(wǎng)絡(luò )到RAM并啟動(dòng)它。具有提供的命令的Shell。文件名為u-boot.kwb。
Linux內核:從RAM運行。完全接管系統(引導程序不再存在)。
1.2.4 常見(jiàn)嵌入式處理器的bootloader
本文將重點(diǎn)介紹通用部分,即主要的引導加載程序重要功能。有幾種開(kāi)源的通用引導加載程序。以下是最受歡迎的:
U-Boot,Denx的通用引導程序
最常用于A(yíng)RM,也可用于PPC,MIPS,x86,m68k,NIOS等。
如今已成為事實(shí)上的標準。我們將詳細研究它。
http://www.denx.de/wiki/U-Boot
Barebox,與體系結構無(wú)關(guān)的引導程序,是U-Boot的后繼產(chǎn)品。它尚不具備U-Boot的硬件支持。U-Boot改善了非常感謝這位競爭對手。
http://www.barebox.org
還有很多其他開(kāi)源或專(zhuān)有的引導程序,通常特定于架構。如RedBoot,Yaboot,PMON等
2. U-Boot
2.1 介紹
U-Boot是一個(gè)典型的免費軟件項目
許可證:GPLv2(與Linux相同)
可從http://www.denx.de/wiki/U-Boot免費獲得
可從http://www.denx.de/wiki/U-Boot/Documentation獲得文檔
Git存儲庫中提供了最新的開(kāi)發(fā)源代碼:
http://git.denx.de/?p=u-boot.git;a=摘要
圍繞開(kāi)放的郵件列表進(jìn)行開(kāi)發(fā)和討論,http://lists.denx.de/pipermail/u-boot/自2008年底開(kāi)始,它遵循固定間隔的發(fā)布時(shí)間表。兩個(gè)幾個(gè)月,發(fā)布了新版本。版本名為YYYY.MM。
2.2 配置文件
從網(wǎng)站獲取源代碼并解壓縮。configs/目錄為每個(gè)受支持的板包含一個(gè)配置文件,定義CPU類(lèi)型,外圍設備及其配置,存儲器映射,應在其中編譯的U-Boot功能等。
注意:U-Boot正在從頭文件中定義的主板配置遷移(include/configs/)改為defconfig,就像在Linux內核(configs/)中一樣
并非所有電路板都已轉換為新的配置系統。硬件供應商提供的較舊的U-Boot版本可能尚未使用此新版本配置系統。
U-BOOT 配置文件CHIP_defconfig舉例如下:
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_MACH_SUN5I=y
CONFIG_DRAM_TIMINGS_DDR3_800E_1066G_1333J=y
# CONFIG_MMC is not set
CONFIG_USB0_VBUS_PIN=“PB10”
CONFIG_VIDEO_COMPOSITE=y
CONFIG_DEFAULT_DEVICE_TREE=“sun5i-r8-chip”
CONFIG_SPL=y
CONFIG_SYS_EXTRA_OPTIONS=“CONS_INDEX=2”
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_DFU=y
CONFIG_CMD_USB_MASS_STORAGE=y
CONFIG_AXP_ALDO3_VOLT=3300
CONFIG_AXP_ALDO4_VOLT=3300
CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_G_DNL_MANUFACTURER=“Allwinner Technology”
CONFIG_G_DNL_VENDOR_NUM=0x1f3a
CONFIG_G_DNL_PRODUCT_NUM=0x1010
CONFIG_USB_EHCI_HCD=y
2.3 配置并編譯
必須先配置U-Boot,然后再進(jìn)行編譯
1.制作BOARDNAME_defconfig
2.其中BOARDNAME是配置名稱(chēng),如configs/目錄。
3.然后,您可以運行make menuconfig進(jìn)一步自定義U-Boot的配置!
確保交叉編譯器在PATH中可用
通過(guò)指定交叉編譯器首選項來(lái)編譯U-Boot。例如,如果交叉編譯器可執行文件是arm-linux-gcc:CROSS_COMPILE= arm-linux-
主要結果是一個(gè)u-boot.bin文件,它是U-Boot映像。取決于您的特定平臺上,可能還有其他專(zhuān)用映像:u-boot.img
2.4 安裝U-Boot
通常必須將U-Boot安裝在閃存中才能由硬件執行。取決于硬件,U-Boot的安裝以不同的方式完成:
CPU提供了某種特定的引導監視器,您可以使用特定的協(xié)議通過(guò)串行端口或USB與之進(jìn)行通信
從固定媒體(NAND)引導之前,CPU首先在可移動(dòng)媒體(MMC)上引導。在這種情況下,請從MMC引導以刷新新版本
U-Boot已經(jīng)安裝,可以用來(lái)發(fā)布新版本的U-Boot。但是請注意:如果新版本的U-Boot無(wú)法正常工作,則該主板將無(wú)法使用
該評估板提供了一個(gè)JTAG接口,該接口允許遠程寫(xiě)入閃存,而無(wú)需在該評估板上運行任何系統。如果引導加載程序不起作用,它還可以挽救一塊板。
2.5 U-boot啟動(dòng)提示信息
通過(guò)串行控制臺將目標連接到主機。接通電路板電源。在串行控制臺上,您將看到類(lèi)似以下內容:
U-Boot Shell提供了一組命令。本文將研究最重要的內容,請參閱文檔以獲取完整參考或help命令。
2.5.1 基本信息命令
2.5.2 重要命令
具體的命令集取決于U-Boot配置
help命令,將列出該配置的所有命令,help command,將列出具體命令的使用幫助
ext2load,將文件從ext2文件系統加載到RAM,還有ext2ls列出文件,ext2info以獲得信息
fatload,將文件從FAT文件系統加載到RAM,還有fatls和fatinfo
tftp,將文件從網(wǎng)絡(luò )加載到RAM
ping,用于測試網(wǎng)絡(luò )的物理連通性
boot,運行默認的啟動(dòng)命令,存儲在bootcmd中
bootz 《address》,啟動(dòng)加載到RAM中給定地址的內核映像
loadb,加載,加載,將文件從串行線(xiàn)加載到RAM
usb,用于初始化和控制USB子系統,主要用于USB存儲USB鑰匙等設備
mmc,用于初始化和控制MMC子系統,用于SD和microSD卡
nand,以擦除,讀取和寫(xiě)入NAND閃存中的內容
erase, protect, cp,用于擦除,修改保護以及寫(xiě)入NOR閃存
md,用于顯示內存內容。對檢查加載到內存中的內容或查看硬件寄存器很有用。
mm,用于修改存儲內容。出于測試目的,直接修改硬件寄存器常常在調試階段很有用。
2.5.3 環(huán)境變量
U-Boot可以通過(guò)環(huán)境變量進(jìn)行配置
1.一些特定的環(huán)境變量會(huì )影響不同命令的行為
2.可以添加自定義環(huán)境變量,并在腳本中使用
在U-Boot啟動(dòng)時(shí)將環(huán)境變量從閃存加載到RAM,可以對其進(jìn)行修改并保存回閃存以實(shí)現持久性
閃存(或MMC存儲器)中有一個(gè)專(zhuān)用位置來(lái)存儲U-Boot環(huán)境,該位置在電路板配置文件中定義
環(huán)境變量相關(guān)的命令:
printenv顯示所有變量
printenv 《變量名》 顯示變量的值
setenv 《變量名》 《變量值》 僅在RAM中更改變量的值
editenv 《變量名》 僅在RAM中編輯變量的值
saveenv將環(huán)境的當前狀態(tài)保存在閃存中
舉例:
重要的U-Boot環(huán)境變量:
bootcmd,指定可配置延遲(bootdelay)后如果引導過(guò)程未中斷,U-Boot將在引導時(shí)自動(dòng)執行的命令
bootargs,包含傳遞給Linux內核的參數,稍后介紹
serverip,U-Boot將與網(wǎng)絡(luò )相關(guān)命令聯(lián)系的服務(wù)器的IP地址
ipaddr,U-Boot將使用的IP地址
netmask,用于與服務(wù)器聯(lián)系的網(wǎng)絡(luò )掩碼
ethaddr 設置(MAC地址)通常只能設置一次
autostart,如果設置為yes,則U-Boot在將圖像加載到內存后自動(dòng)啟動(dòng)圖像(tftp,fatload等)
filesize,最新復制到內存的大?。▉?lái)自tftp,fatload,nand讀取等)
為實(shí)現復雜的啟動(dòng),環(huán)境變量可以包含小腳本,以執行多個(gè)命令并測試命令結果。
腳本對于自動(dòng)啟動(dòng)或升級過(guò)程很有用
可使用鏈接多個(gè)命令,使用分號操作符;
條件表達式:if command ;then 。。。 ; else 。。。 ; fi
使用運行《variable-name》執行腳本
您可以使用${variable-name}引用其他變量
舉例:
setenv mmc-boot ‘if fatload mmc 0 80000000boot.ini; then source; else
if fatload mmc 0 80000000 zImage; then runmmc-do-boot; fi; fi’
2.5.4 傳送文件到目標板
U-Boot主要用于加載和引導內核映像,但是它也允許更改內核映像和存儲在閃存中的根文件系統。必須在目標和開(kāi)發(fā)工作站之間交換文件。
可能的方法:
如果目標設備具有以太網(wǎng)連接,并且U-Boot包含用于以太網(wǎng)芯片的驅動(dòng)程序,則通過(guò)網(wǎng)絡(luò )。這是最快,最有效的解決方案。
如果U-Boot在使用的平臺支持USB控制器,則可以通過(guò)U盤(pán)
如果U-Boot在使用的平臺支持MMC控制器,則可以通過(guò)SD卡或microSD卡
通過(guò)串口,但一般效率較低
通過(guò)TFTP:
將文件通過(guò)TFTP網(wǎng)絡(luò )從開(kāi)發(fā)工作站(Host)傳輸到目標機(Target)上的U-Boot。是一種普通文件傳輸協(xié)議,類(lèi)似于FTP,但是沒(méi)有身份驗證并且采用UDP傳輸層協(xié)議
開(kāi)發(fā)工作站上需要配置TFTP服務(wù)器,可參照下列步驟進(jìn)行配置
1.sudo apt install tftpd-hpa
2. 所有位于開(kāi)發(fā)工作站上/var/lib/tftpboot中的文件對于TFTP
3.tftp-hpa軟件包中提供了TFTP客戶(hù)端,可用于測試
TFTP服務(wù)器是否搭建成功 TFTP客戶(hù)端已集成到U-Boot中,通過(guò)以下步驟進(jìn)行配置測試
1.配置ipaddr以及serverip環(huán)境變量
2.使用tftp 《address》《filename》 加載文件進(jìn)行傳輸。
評論