一個完整的嵌入式linux系統包含4部分內容:Bootloader、Parameters、Kernel、Root File System。3、4、5、6部分詳細介紹了這4部分的內容,這是Linux底層軟件開發人員應該掌握的。通過學習這些章節,您可以詳細了解到如何在一個裸板上裁減、移植Linux,如何構造自己的根文件系統,如何編寫適合客戶需求的驅動程序——驅動程序這章將結合幾個經典的驅動程序進行講解。您還可以了解到在用在nand flash上的非常流行的yaffs文件系統是如何工作的,本書將結合yaffs代碼詳細介紹yaffs文件系統。
BIOS、BootLoader、uboot對比
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.調用內核
--------------------------------------------------------------------------------
uboot??
?
Uboot用于多種嵌入式CPU的BootLoader程序
支持多種嵌入式操作系統的引導
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
?