uboot只是bootloader這個(gè)子功能的一個(gè)軟件而已。
其最終功能就是啟動(dòng)加載kernel。
?
:在uboot中輸入問號(hào)丑蛤,可以查看uboot支持的所有命令。
一撕阎、uboot常用命令
學(xué)習(xí)uboot和學(xué)習(xí)shell一樣受裹,知道其命令就可以使用了。
uboot中,不能像shell中一樣按TAB鍵補(bǔ)全棉饶。
1厦章、print
可以寫成縮寫:pri
查看uboot這個(gè)軟件的環(huán)境變量。
環(huán)境變量形式:變量名=變量值
2照藻、setenv袜啃、saveenv
(1)setenv:設(shè)置環(huán)境變量
添加一個(gè)新的變量
setenv abc 100 200
:將100 200
字符串賦給abc
。
修改一個(gè)已有變量
setenv abc 500
刪除一個(gè)已有變量
setenv abc
(2)saveenv : 保存環(huán)境變量
使用setenv設(shè)置的環(huán)境變量岩梳,是保存在內(nèi)存的一小塊空間(RAM)上的囊骤。因此,當(dāng)重啟后冀值,就不生效了也物。
把本次設(shè)置的環(huán)境變量從內(nèi)存寫到flash存儲(chǔ)器。
saveenv是一個(gè)通用接口列疗。
- 如果配置的saveenv是nand flash滑蚯,就會(huì)寫到板子的nand flash中
燒寫nand時(shí),必須先擦除(Erasing Nand...)抵栈,再燒寫(Writing to Nand...)告材。 - 有些板子是nor flash,比如路由器古劲,因此可以配置燒到nor flash中
- 有的還可以設(shè)置燒到SD卡中
3斥赋、ipaddr
uboot網(wǎng)絡(luò)層的設(shè)置,與ipaddr變量的變量名有關(guān)产艾。
setenv ipaddr 192.168.9.120
:修改ipaddr變量的變量名疤剑。
uboot為了精簡,沒有集成ping命令的協(xié)議(ICMP)的echo包闷堡,所以如果用PC去ping板子隘膘,數(shù)據(jù)可以發(fā)過去,但是不會(huì)發(fā)送反饋信息杠览,因此永遠(yuǎn)ping不通弯菊。
所以要用板子去ping PC。
4踱阿、TFTP
uboot傳輸層管钳,通過TFTP驗(yàn)證通不通。
(1)C / S
C : 開發(fā)板
怎么用客戶端软舌?
// PC上:連誰才漆?哪個(gè)端口?做什么事葫隙?
./client server_ip port xxxx
// uboot
server_ip變成了通過環(huán)境變量serverip來取得
port:tftp這個(gè)命令寫死
xxxx:干什么事情栽烂,由tftp 這個(gè)命令通過輸入?yún)?shù)給
tftp 20008000 abc
S :PC
1)windows
- tftpd:綠色的軟件安裝包躏仇。
2)linux
- 32bit:sudo apt-get install tftpd-hpa
- 64bit:sudo apt-get install tftpd openbsd-xinetd
(2)驗(yàn)證機(jī)器中是否運(yùn)行了TFTP
5恋脚、nand
nand命令是uboot提供給程序員燒寫或修改nand flash設(shè)備的命令集合腺办。
flash的內(nèi)部結(jié)構(gòu)是按頁來分的,而不是按bit來分的糟描。
nand [動(dòng)詞] [內(nèi)存地址] [nand flash的內(nèi)部地址] [搬移大小]
// 動(dòng)詞:erase怀喉、write、read
例1:
把nand flash中5M空間讀到內(nèi)存地址21000000(默認(rèn)是16進(jìn)制)中船响,讀1k大小躬拢。
// 1M:2^20 ---> 1 0000...000 (2進(jìn)制:1后面20個(gè)0)---> 0x100000 (16進(jìn)制:1后面5個(gè)0)
// 5M:5 * 1M
nand read 21000000 500000 1024
// nand flash有個(gè)特性:在用之前,需先進(jìn)行初始化见间,即先擦除聊闯。擦除完才能write進(jìn)去。
nand erase 500000 1024 // write前需先erase
nand write 21000000 500000 1024
6米诉、bootm
該命令的功能就是啟動(dòng)kernel菱蔬。
但是bootm后,還在uboot中史侣,kernel并沒有真正啟動(dòng)起來拴泌。
7、go
把程序的PC指針指到一個(gè)地方惊橱,就能運(yùn)行起來蚪腐。
把kernel放到一個(gè)地方,go到該地方税朴,直接從kernel開始運(yùn)行回季,就啟動(dòng)了kernel。
go命令天生啟動(dòng)不了kernel掉房。
二茧跋、內(nèi)核啟動(dòng)條件
內(nèi)核并不是一個(gè)可執(zhí)行的東西,并不是把PC指針指過去就可以運(yùn)行卓囚。內(nèi)核啟動(dòng)是需要條件的瘾杭。
先bootm,再go哪亿。
環(huán)境變量中還必須有bootargs變量粥烁,該變量銜接了uboot和kernel。
1蝇棉、啟動(dòng)參數(shù)
root=
:啟動(dòng)的根文件系統(tǒng)在哪個(gè)設(shè)備中讨阻。
設(shè)備信息(如Ram、NFS篡殷、flash)
init=
:內(nèi)核啟動(dòng)后钝吮,第一個(gè)可執(zhí)行文件init進(jìn)程從哪里來。
console=
:內(nèi)核啟動(dòng)時(shí),使用哪個(gè)設(shè)備作為控制臺(tái)奇瘦。
3個(gè)啟動(dòng)參數(shù)設(shè)置后棘催,內(nèi)核啟動(dòng)了,但是與用戶無法交互耳标,因?yàn)楦募到y(tǒng)還沒有醇坝。需要啟動(dòng)文件系統(tǒng)后,才能與用戶進(jìn)行交互次坡。