本文簡明扼要的介紹了嵌入式 Linux 的引導過程,X86 體系的引導過程以及幾種常見嵌入式處理器的引導過程,U-Boot 的移植的基本步驟、常用命令如何使用。通過本文可以對嵌入式 Linux 的引導從概念到實際操作有一個總體清晰的認識
1. 啟動順序
1.1 Bootloader
Bootloader(引導加載程序)本質上是一小段程序,其基本功能在于:
基本的硬件初始化
從閃存存儲,網絡或其他類型的非易失性存儲中加載應用程序二進制文件(通常是操作系統內核)。
可能會對應用程序二進制文件進行解壓縮
執行申請
除此基本功能之外,大多數 Bootloader(引導加載程序)實現了 Shell 命令集以執行不同操作。
從存儲或網絡中加載數據,內存檢查,硬件診斷和測試等
1.2 基于 BIOS-X86 的引導
x86 處理器通常安裝在在一塊包含 BIOS 程序的非易失性存儲器主板上。
在基于 BIOS 的舊 x86 平臺上:BIOS 負責基本的硬件初始化和從非易失性存儲中加載一小段代碼。
這段代碼通常是第一階段的引導程序 bootloader,它將加載完整的引導程序 bootloader 本身。
bootloader 可以解析文件系統,因此內核映象可以直接從普通文件系統中加載。
此順序與現代基于 EFI 的系統不同。
用于 X86 體系 Linux 的 bootloader 常用的有以下兩種:
GNU GRUB(GRand UnifiedBootloader 簡稱“GRUB”)是一個來自 GNU 項目的多操作系統啟動程序。GRUB 是多啟動規范的實現,它允許用戶可以在計算機內同時擁有多個操作系統,并在計算機啟動時選擇希望運行的操作系統。GRUB 可用于選擇操作系統分區上的不同內核,也可用于向這些內核傳遞啟動參數。
在 X86 架構的機器中,Linux、BSD 或其它 Unix 類的操作系統中 GRUB、LILO 是大家最為常用,應該說是主流。
詳細信息請參考:http://www.gnu.org/software/grub/
syslinux 是一個功能強大的引導加載程序,而且兼容各種介質。它的目的是簡化首次安裝 Linux 的時間,并建立修護或其它特殊用途的啟動盤。它的安裝很簡單,一旦安裝 syslinux 好之后,sysLinux 啟動盤就可以引導各種基于 DOS 的工具,以及 MS-DOS/Windows 或者任何其它操作系統。不僅支持采用 BIOS 結構的主板,而且從 6.0 版也開始支持采用 EFI 結構的新型主板。
Syslinux 常被用于自網絡或者可移動存儲介質(如 USB/CD-ROM)引導 Linux
詳細信息請參考:https://kernel.org/pub/linux/utils/boot/syslinux/
1.3 嵌入式 CPU 的引導
Case 1:CPU 內部無引導代碼
CPU 上電后,CPU 開始在固定地址入口執行代碼
CPU 沒有提供其他引導機制
硬件設計必須確保已連接存儲芯片(如 NOR 閃存芯片)這樣就可以在 CPU 啟動的地址訪問它并執行指令
第一級引導程序必須在此地址編程在該存儲芯片中(如 NOR)
NOR 是強制性的,因為它允許隨機訪問,NAND 不允許
注:這種方案已不常用,因為需要 NOR FLASH
Case2:CPU 內具有引導代碼
CPU 在 ROM 中具有集成的引導代碼。如:AT91 CPU 上的 BootROM,OMAP 上的“ ROM 代碼”,等等。具體細節取決于 CPU 體系結構
此引導代碼能夠將第一級引導加載程序從存儲設備加載到內部 SRAM(因為 DRAM 尚未初始化)。 存儲設備通常可以是:MMC,NAND,SPI 閃存,UART(通過串行線傳輸數據)等等。
第一階段的引導程序: 由于硬件限制,尺寸有限(SRAM 比較貴), 由 CPU 供應商或社區項目提供
此第一階段引導程序必須初始化 DRAM 和其他硬件設備,并將第二階段的引導程序加載到 RAM
因為本文專注嵌入式領域,故接下來將描述幾種常見的嵌入式處理器的引導過程。
RomBoot:嘗試從各種設備中找到有效的引導映像存儲源,然后將其加載到 SRAM 中(DRAM 還未初始化)。大小限制為 4 KB,無法進行用戶互動標準啟動模式。
AT91Bootstrap:從 SRAM 運行。初始化 DRAM,NAND 或 SPI 控制器,并將輔助引導程序加載到 RAM 并啟動它,此階段沒有用戶互動的可能。
U-Boot:從 RAM 運行。初始化其他一些硬件設備(網絡,USB 等)。從存儲或加載內核映像網絡到 RAM 并啟動它。此階段 Shell 命令可以使用。
Linux 內核:從 RAM 運行。完全接管系統(引導加載程序 bootloader 不再存在)。
1.2.2 ARM TI OMAP2+/AM33xx 的引導
ROM 代碼:嘗試從各種方法中找到有效的引導映像存儲源,并將其加載到 SRAM 或 RAM 中(RAM 可以是由 ROM 代碼通過配置標頭初始化)。尺寸限制為《64 KB。沒有用戶互動的可能。
X-Loader 或 U-Boot SPL:從 SRAM 運行。初始化 DRAM,NAND 或 MMC 控制器,并加載輔助將引導程序加載到 RAM 中并啟動它。沒有用戶互動的可能。文件名為 MLO。
U-Boot:從 RAM 運行。初始化其他一些硬件設備(網絡,USB 等)。從存儲或加載內核映像網絡到 RAM 并啟動它。具有提供的命令的 Shell。該文件一般名為 u-boot.bin 或 u-boot.img。
Linux 內核:從 RAM 運行。完全接管系統(引導程序不再存在)。
1.2.3 MarvellSoCs 的引導
ROM 代碼:嘗試從各種方法中找到有效的引導影像
存儲源,并將其加載到 RAM 中。RAM 配置為在特定于 CPU 的標頭中進行了描述,該標頭已添加到引導加載程序中圖片。
U-Boot:從 RAM 運行。初始化其他一些硬件設備(網絡,USB 等)。從存儲或加載內核映像網絡到 RAM 并啟動它。具有提供的命令的 Shell。文件名為 u-boot.kwb。
Linux 內核:從 RAM 運行。完全接管系統(引導程序不再存在)。
1.2.4 常見嵌入式處理器的 bootloader
本文將重點介紹通用部分,即主要的引導加載程序重要功能。有幾種開源的通用引導加載程序。以下是最受歡迎的:
U-Boot,Denx 的通用引導程序
最常用于 ARM,也可用于 PPC,MIPS,x86,m68k,NIOS 等。
如今已成為事實上的標準。我們將詳細研究它。
http://www.denx.de/wiki/U-Boot
Barebox,與體系結構無關的引導程序,是 U-Boot 的后繼產品。它尚不具備 U-Boot 的硬件支持。U-Boot 改善了非常感謝這位競爭對手。
http://www.barebox.org
還有很多其他開源或專有的引導程序,通常特定于架構。如 RedBoot,Yaboot,PMON 等
2. U-Boot
2.1 介紹
U-Boot 是一個典型的免費軟件項目
許可證:GPLv2(與 Linux 相同)
可從 http://www.denx.de/wiki/U-Boot 免費獲得
可從 http://www.denx.de/wiki/U-Boot/DocumentaTIon 獲得文檔
Git 存儲庫中提供了最新的開發源代碼:
http://git.denx.de/?p=u-boot.git;a=摘要
圍繞開放的郵件列表進行開發和討論,http://lists.denx.de/pipermail/u-boot/ 自 2008 年底開始,它遵循固定間隔的發布時間表。兩個幾個月,發布了新版本。版本名為 YYYY.MM。
2.2 配置文件
從網站獲取源代碼并解壓縮。configs/ 目錄為每個受支持的板包含一個配置文件,定義 CPU 類型,外圍設備及其配置,存儲器映射,應在其中編譯的 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,然后再進行編譯
1. 制作 BOARDNAME_defconfig
2. 其中 BOARDNAME 是配置名稱,如 configs/ 目錄。
3. 然后,您可以運行 make menuconfig 進一步自定義 U-Boot 的配置!
確保交叉編譯器在 PATH 中可用
通過指定交叉編譯器首選項來編譯 U-Boot。例如,如果交叉編譯器可執行文件是 arm-linux-gcc:CROSS_COMPILE= arm-linux-
主要結果是一個 u-boot.bin 文件,它是 U-Boot 映像。取決于您的特定平臺上,可能還有其他專用映像:u-boot.img
2.4 安裝 U-Boot
通常必須將 U-Boot 安裝在閃存中才能由硬件執行。取決于硬件,U-Boot 的安裝以不同的方式完成:
CPU 提供了某種特定的引導監視器,您可以使用特定的協議通過串行端口或 USB 與之進行通信
從固定媒體(NAND)引導之前,CPU 首先在可移動媒體(MMC)上引導。在這種情況下,請從 MMC 引導以刷新新版本
U-Boot 已經安裝,可以用來發布新版本的 U-Boot。但是請注意:如果新版本的 U-Boot 無法正常工作,則該主板將無法使用
該評估板提供了一個 JTAG 接口,該接口允許遠程寫入閃存,而無需在該評估板上運行任何系統。如果引導加載程序不起作用,它還可以挽救一塊板。
2.5 U-boot 啟動提示信息
通過串行控制臺將目標連接到主機。接通電路板電源。在串行控制臺上,您將看到類似以下內容:
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,將文件從網絡加載到 RAM
ping,用于測試網絡的物理連通性
boot,運行默認的啟動命令,存儲在 bootcmd 中
bootz 《address》,啟動加載到 RAM 中給定地址的內核映像
loadb,加載,加載,將文件從串行線加載到 RAM
usb,用于初始化和控制 USB 子系統,主要用于 USB 存儲 USB 鑰匙等設備
mmc,用于初始化和控制 MMC 子系統,用于 SD 和 microSD 卡
nand,以擦除,讀取和寫入 NAND 閃存中的內容
erase, protect, cp,用于擦除,修改保護以及寫入 NOR 閃存
md,用于顯示內存內容。對檢查加載到內存中的內容或查看硬件寄存器很有用。
mm,用于修改存儲內容。出于測試目的,直接修改硬件寄存器常常在調試階段很有用。
2.5.3 環境變量
U-Boot 可以通過環境變量進行配置
1. 一些特定的環境變量會影響不同命令的行為
2. 可以添加自定義環境變量,并在腳本中使用
在 U-Boot 啟動時將環境變量從閃存加載到 RAM,可以對其進行修改并保存回閃存以實現持久性
閃存(或 MMC 存儲器)中有一個專用位置來存儲 U-Boot 環境,該位置在電路板配置文件中定義
環境變量相關的命令:
printenv 顯示所有變量
printenv 《變量名》 顯示變量的值
setenv 《變量名》 《變量值》 僅在 RAM 中更改變量的值
editenv 《變量名》 僅在 RAM 中編輯變量的值
saveenv 將環境的當前狀態保存在閃存中
舉例:
重要的 U-Boot 環境變量:
bootcmd,指定可配置延遲(bootdelay)后如果引導過程未中斷,U-Boot 將在引導時自動執行的命令
bootargs,包含傳遞給 Linux 內核的參數,稍后介紹
serverip,U-Boot 將與網絡相關命令聯系的服務器的 IP 地址
ipaddr,U-Boot 將使用的 IP 地址
netmask,用于與服務器聯系的網絡掩碼
ethaddr 設置(MAC 地址)通常只能設置一次
autostart,如果設置為 yes,則 U-Boot 在將圖像加載到內存后自動啟動圖像(tftp,fatload 等)
filesize,最新復制到內存的大小(來自 tftp,fatload,nand 讀取等)
為實現復雜的啟動,環境變量可以包含小腳本,以執行多個命令并測試命令結果。
腳本對于自動啟動或升級過程很有用
可使用鏈接多個命令,使用分號操作符;
條件表達式: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 主要用于加載和引導內核映像,但是它也允許更改內核映像和存儲在閃存中的根文件系統。必須在目標和開發工作站之間交換文件。
可能的方法:
如果目標設備具有以太網連接,并且 U-Boot 包含用于以太網芯片的驅動程序,則通過網絡。這是最快,最有效的解決方案。
如果 U-Boot 在使用的平臺支持 USB 控制器,則可以通過 U 盤
如果 U-Boot 在使用的平臺支持 MMC 控制器,則可以通過 SD 卡或 microSD 卡
通過串口,但一般效率較低
通過 TFTP:
將文件通過 TFTP 網絡從開發工作站(Host)傳輸到目標機(Target)上的 U-Boot。是一種普通文件傳輸協議,類似于 FTP,但是沒有身份驗證并且采用 UDP 傳輸層協議
開發工作站上需要配置 TFTP 服務器,可參照下列步驟進行配置
1.sudo apt install tftpd-hpa
2. 所有位于開發工作站上 /var/lib/tftpboot 中的文件對于 TFTP
3.tftp-hpa 軟件包中提供了 TFTP 客戶端,可用于測試
TFTP 服務器是否搭建成功 TFTP 客戶端已集成到 U-Boot 中,通過以下步驟進行配置測試
1. 配置 ipaddr 以及 serverip 環境變量
2. 使用 tftp 《address》《filename》 加載文件進行傳輸。
審核編輯 黃昊宇
-
嵌入式
+關注
關注
5198文章
20449瀏覽量
334025 -
Linux
+關注
關注
88文章
11760瀏覽量
219023
發布評論請先 登錄
嵌入式單片機開發學習路徑
Linux 下開發嵌入式必備命令速查表
如何在Zynq UltraScale+ MPSoC平臺上通過JTAG啟動嵌入式Linux鏡像
arm嵌入式主板優缺點
從小白到大牛:Linux嵌入式系統開發的完整指南
什么是嵌入式操作系統?
分享一個嵌入式開發學習路線
功率芯片PCB嵌埋式封裝“從概念到量產”,如何構建?
嵌入式從入門到進階,怎么學?
【「Yocto項目實戰教程:高效定制嵌入式Linux系統」閱讀體驗】+基礎概念學習理解
怎么結合嵌入式,Linux,和FPGA三個方向達到一個均衡發展?
從概念到實際操作對嵌入式Linux的總體認識
評論