烧写linux内核的步骤,启动redboot后,向目标机烧写一个linux内核的全过程
命令說明
對一個沒有內(nèi)核和根文件系統(tǒng)的板子是不可以運轉(zhuǎn)的,當通過一種方式下載了RedBoot引導(dǎo)程序以后,我們可以通過下面的方式下載內(nèi)核和根文件系統(tǒng)。
在本系統(tǒng)中,我們對內(nèi)核和根文件系統(tǒng)的下載是通過tftp服務(wù)完成的。
整個Flash空間是16M ,它的地址范圍:0x50000000 – 0x50fe0000 ,共有128塊,每一塊的大小是128K 。0x50000000 – 0x50080000范圍放的是RedBoot引導(dǎo)程序和各種配置,0x50080000 – 0x50200000范圍放的是Linux內(nèi)核zImage,0x50200000 – 0x50380000范圍放的是根文件系統(tǒng)ramdisk,0x50380000 – 0x50f60000范圍放的是jffs2文件格式。剩余0x50f60000---0x50fe0000范圍的512K空間放日志系統(tǒng).
以下過程為啟動redboot后,向目標機燒寫一個linux內(nèi)核的全過程
先對flash進行初始化
RedBoot> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
對剩余的FLASH空間解除鎖定
RedBoot> fis unlock -f 0x50080000 -l 0xf60000
... Unlock from 0x50080000-0x50fe0000: .........................................
................................................................................
..然后擦除
RedBoot> fis erase -f 0x50080000 -l 0xf60000
... Erase from 0x50080000-0x50fe0000: ..........................................
................................................................................
.顯示FLASH分區(qū)信息
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x50000000 0x50000000 0x00060000 0x00000000
FIS directory 0x50060000 0x50060000 0x0001F000 0x00000000
RedBoot config 0x5007F000 0x5007F000 0x00001000 0x00000000
下面兩步把內(nèi)核zImage.H5500傳送到目標板上,然后將其燒到flash的0x50080000地址中
RedBoot> load zImage.H5500 -b 0x2000000 -r -m tftp -h 192.168.9.190
Raw file loaded 0x02000000-0x0211e52b, assumed entry at 0x02000000
將其燒到flash的0x50080000地址中, zImage分配的空間為0x180000K
RedBoot> load zImage.H5500 -b 0x2000000 -r -m tftp -h 192.168.9.190
Raw file loaded 0x02000000-0x0211e52b, assumed entry at 0x02000000
RedBoot> fis create -b 0x2000000 -l 0x180000 -f 0x50080000 zImage
... Erase from 0x50080000-0x50200000: ............
... Program from 0x02000000-0x02180000 at 0x50080000: ............
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000:
將ramdisk.gz.H5500傳送到目標板上,然后將其燒到flash的0x50020000地址中
RedBoot> load ramdisk.gz.H5500 -b 0x800000 -r -m tftp -h 192.168.9.190
Raw file loaded 0x00800000-0x0098a8df, assumed entry at 0x00800000
RedBoot> fis create -b 0x800000 -l 0x180000 -f 0x50200000 ramdisk
... Erase from 0x50200000-0x50380000: ............
... Program from 0x00800000-0x00980000 at 0x50200000: ............
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
將jffs2.rescue.img傳送到目標板上,然后將其燒到flash的0x50380000地址中
RedBoot> load jffs2.rescue.img -b 0x800000 -r -m tftp -h 192.168.9.190
Raw file loaded 0x00800000-0x00898c6b, assumed entry at 0x00800000
RedBoot> fis create -b 0x800000 -l 0xbe0000 -f 0x50380000 jffs2
... Erase from 0x50380000-0x50f60000: ..........................................
.....................................................
... Program from 0x00800000-0x013e0000 at 0x50380000: ..........................
.....................................................................
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x50000000 0x50000000 0x00060000 0x00000000
FIS directory 0x50060000 0x50060000 0x0001F000 0x00000000
RedBoot config 0x5007F000 0x5007F000 0x00001000 0x00000000
zImage 0x50080000 0x50080000 0x00180000 0x02000000
ramdisk 0x50200000 0x50200000 0x00200000 0x00800000
jffs2 0x50380000 0x50380000 0x00be0000 0x00200000
fconfig,此命令是配置腳本命令
RedBoot> fconfig
Run script at boot: true
Boot script:
Enter script, terminate with empty line
>> fis unlock -f 0x50380000 -l 0xbe0000
>> fis load -b 0x2000000 zImage
>> fis load -b 0x800000 ramdisk
>> exec 0x2000000
>>
Boot script timeout (1000ms resolution): 3
Use BOOTP for network configuration: true
Default server IP address: 192.168.0.43
Console baud rate: 115200
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Default network device: npe_eth0
Network hardware address [MAC] for npe_eth0: 0x00:0x0F:0x0E:0x01:0x02:0x03
Update RedBoot non-volatile configuration - continue (y/n)? (出現(xiàn)此提示時,請輸入y)
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
顯示FLASH被擦除但位被使用的空間
RedBoot> fis free
0x50F60000 .. 0x50FDFFFF
到這里整個燒寫過程結(jié)束。
RedBoot可以在多種不同配置下運行,但一般都是從目標平臺的閃存引導(dǎo)區(qū)或引導(dǎo)ROM啟動。RedBoot設(shè)計為系統(tǒng)上電啟動,能提供完整的處理器初始化和設(shè)備設(shè)置,使設(shè)計人員能夠迅速開始與系統(tǒng)通信。
出現(xiàn) RedBoot>
后,就表明redboot已經(jīng)準備好,用戶可以開始輸入命令。
RedBoot命令的基本格式是:
命令 [-選項1] [-選項2 參數(shù)值] 操作符
命令格式中的選項1和選項2代表可以加到某些命令中的可選參數(shù),用于指示一些特定動作或附加信息,在選項2中還包括一個數(shù)值。操作符定義了某些特殊命令所需的附加信息。命令也可以縮寫成最短的無歧義字符串,如dump、dum、du和d都是dump命令的有效寫法。
RedBoot用load命令下載應(yīng)用軟件映像,映像可以用TFTP協(xié)議、X/Y調(diào)制解調(diào)器協(xié)議或直接從目標硬件下載。
RedBoot常用的幾條命令:
首先是閃存映像系統(tǒng)(fis)命令,當硬件平臺上配有閃存時,RedBoot提供fis命令作為基本文件系統(tǒng),這些命令主要用來管理文件系統(tǒng)映像。
另一個有用的命令是基于閃存的配置和控制命令fconfig。用fconfig命令查詢的輸出信息,配置命令可以設(shè)置RedBoot啟動順序。啟動配置包括是否在初始化期間運行引導(dǎo)腳本、是否用BOOTP協(xié)議獲取IP地址等等。
RedBoot支持引導(dǎo)腳本,因此允許用戶在上電過程完成后執(zhí)行所需命令。在產(chǎn)品測試階段采用RedBoot裝載應(yīng)用軟件映像時引導(dǎo)腳本很有好處,用戶還可以設(shè)置超時參數(shù),在引導(dǎo)腳本執(zhí)行前按下Ctrl+C中斷執(zhí)行。引導(dǎo)腳本可用fconfig命令進行設(shè)置。
RedBoot命令介紹:
引用一個別名,如為joe的別名為This is Joe
RedBoot> alias joe "This is Joe"
設(shè)置IP,如改變SERVER IP為192.168.1.104
RedBoot> ip_address -h 192.168.1.104
IP: 192.168.1.31, Default server: 192.168.1.104, DNS server IP: 192.168.1.101
Load命令:從宿主機下載程序到目標機詳細用法在flash燒寫過程中舉例
Version : 顯示RedBoot的版本,使用平臺,內(nèi)存和FLASH空間大小等等信息。
RedBoot > version
RedBoot(tm) bootstrap and debug environment [ROM]
Red Hat certified release, version 2.02 - built 21:47:00, Jun 19 2006
Platform: IXDP425 Development Platform (IXP42X 400MHz) BE
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00000000-0x08000000, [0x00029808-0x07fc1000] available
FLASH: 0x50000000 - 0x50fe0000, 127 blocks of 0x00020000 bytes each.
mfill : 用指定的方式向向存儲器中寫數(shù)據(jù)。
Mfill {-b location} {-l length} {-p value} [-1 | -2| -4]
-b : 存儲器中,被寫入數(shù)據(jù)的起始地址。
-l :被寫入數(shù)據(jù)的長度。
-p :被寫入數(shù)據(jù)的內(nèi)容。
RedBoot> x -b 00400000 -l 0x40
00061A80: FF FF FF FF FF FC FF FF BF FF EF FF EF FF DF FF |................|
00061A90: FF EF FF FF FF BF FF FD FE FF F7 FF FF FF 5F FF |.............._.|
00061AA0: FF 5F FF DF FF FF FF 6F FC FF BB FF BF FF D7 FF |._.....o........|
00061AB0: FF FF FF FB FF F7 FF FF AF FF BE FF 7F FF FE FF |................|
RedBoot> mfill -b 0x00400000 -l 0x40 -p 0x98765423
RedBoot> x -b 0x00400000 -l 0x40
00400000: 98 76 54 23 98 76 54 23 98 76 54 23 98 76 54 23 |.vT#.vT#.vT#.vT#|
00400010: 98 76 54 23 98 76 54 23 98 76 54 23 98 76 54 23 |.vT#.vT#.vT#.vT#|
00400020: 98 76 54 23 98 76 54 23 98 76 54 23 98 76 54 23 |.vT#.vT#.vT#.vT#|
00400030: 98 76 54 23 98 76 54 23 98 76 54 23 98 76 54 23 |.vT#.vT#.vT#.vT#|
Flash Image System(FIS)
如果在一個板子上有Flash存儲器,RedBoot能夠把image引導(dǎo)到Flash中。運行的對象,包括一些數(shù)據(jù)還有一些簡單的文件也能夠存放到Flash中。fis 這個命令能夠被使用運行Flash中的內(nèi)容。
fis init [-f] :初始化(FIS),當RedBoot第一次在器件上安裝的時候這個命令被運行。
-f :Flash的所有的塊全部被檫除。
RedBoot> fis init –f
About to initialize [format] flash image system - are you sure (y/n)?n
fis [-c] [-d] list :列出FIS 中一般的文件,一些能夠以RedBoot的名字運行,另外一些能夠被使用者執(zhí)行。
-c :image的ckecksum代替Mem Addr。
-d :image的datalenggth代替length。
RedBoot> fis list
Name flash addr Mem addr Length Entry point
RedBoot 0x50000000 0x50000000 0x00060000 0x00000000
FIS directory 0x50060000 0x50060000 0x0001F000 0x00000000
RedBoot config 0x5007F000 0x5007F000 0x00001000 0x00000000
RedBoot> fis list -c
Name flash addr Checksum Length Entry point
RedBoot 0x50000000 0x00000000 0x00060000 0x00000000
FIS directory 0x50060000 0x00000000 0x0001F000 0x00000000
RedBoot config 0x5007F000 0x00000000 0x00001000 0x00000000
fis free : 顯示Flash中還有那些地址空間沒有被使用,使用這個命令可以知道另外一些image下載的位置。
RedBoot> fis free
0x50080000 .. 0x50FDFFFF
fis create –b -l[-f] [-e] [-r] [-s] [-n] : 在FIS 目錄中創(chuàng)造一個image,image中的數(shù)據(jù)在拷貝之前必須存在在RAM存儲器中。(首先,使用load命令把image下載到RAM中,然后運用fis create命令把他寫入Flash中。)
name :文件的名字,顯示在FIS 目錄中。
-b :在RAM中的一個位置,為了得到image,這是一個必須的參數(shù)。
-l :image的長度。如果image已經(jīng)存在,那么它的長度被推斷根據(jù)先前image被創(chuàng)造的時間。特殊的情況下,它可能和原來的初始化的數(shù)據(jù)是一樣的。
-f :image在Flash中的位置。一般情況下,位置被確定根據(jù)現(xiàn)在的image所在的位置,如果在Flash還沒有image的存在,那么剩余的塊是足夠的被使用。
-e :執(zhí)行登陸的地址。如果image的開始地址不知道或者是不需要被考慮,-e被使用。
-r :當image通過fis load命令下載在RAM 中的位置。但是在這里要求這個image是給定的。
-s :被寫入Flash數(shù)據(jù)的真實的長度,如果不能出現(xiàn),那么image的長度是假定的,-s比-l給出的數(shù)據(jù)要短一些,
-n :僅僅更新FIS的目錄,沒有數(shù)據(jù)被拷貝從RAM到Flash中,這個特點能夠被使用登陸FIS,如果它已經(jīng)壞掉。
RedBoot > fis create RedBoot -f 0x50000000 -b 0x07000000 -l 0x60000
An image named 'RedBoot' exists - continue (y/n)? n
RedBoot> fis unlock -f 0x50080000 -l 0x20000
... Unlock from 0x50080000-0x500a0000: .
RedBoot> fis erase -f 0x50080000 -l 0x20000
... Erase from 0x50080000-0x500a0000: .
RedBoot> fis create fuck -b 0x05000000 -l 0x20000
... Erase from 0x50080000-0x500a0000: .
... Program from 0x05000000-0x05020000 at 0x50080000: .
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0x50000000 0x50000000 0x00060000 0x00000000
FIS directory 0x50060000 0x50060000 0x0001F000 0x00000000
RedBoot config 0x5007F000 0x5007F000 0x00001000 0x00000000
fuck 0x50080000 0x05000000 0x00020000 0xFFFFFFFF
fis load [-b ] [-c] [-d] name : 拷貝一個image從Flash到RAM。一旦被下載,它可能運用go命令執(zhí)行。如果加上-b參數(shù),image被拷貝從Flash到RAM 的指定的位置,如果不加上-b參數(shù),image被拷貝從Flash到image被創(chuàng)造的地址。
-name :一個顯示在FIS 目錄中的文件名。
-b :存儲器中,被寫入數(shù)據(jù)的開始地址。
-c :下載到存儲器之后計算并打印image數(shù)據(jù)的校驗和。
-d :當拷貝image從Flash到RAM 時減壓縮它。
RedBoot> fis load RedBoot
RedBoot> go
執(zhí)行l(wèi)inux kernel
RedBoot> exec
fis delete name : 移出一個image從FIS 中,Flash一部分空間將要被檫除,而且移出映像的名字從Flash的目錄中。
RedBoot> fis delete fuck
Delete image 'fuck' - continue (y/n)? y
... Erase from 0x50080000-0x500a0000: .
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
fis lock –f -l : 寫保護一部分Flash扇區(qū),預(yù)防意外的重寫image。為了對Flash進行一些更改,一個匹配的開啟命令必須是有的,
RedBoot> fis lock -f 0x50090000 -l 0x20000
... Lock from 0x50080000-0x500b0000: ..
fis unlock –f -l : 開啟一部分Flash扇區(qū),允許這部分扇區(qū)被更新,這部分區(qū)域一定是被寫保護過的。
RedBoot> fis unlock -f 0x50090000 -l 0x20000
... Unlock from 0x50090000-0x500b0000: ..
fis erase –f -l : 檫除一部分Flash扇區(qū),沒有被檫除的那部分Flash扇區(qū)是不能被下載image的。
RedBoot> fis erase –f 0x50090000 –l 0x20000
…Erase from 0x50090000 – 0x500b0000:..
fis write –b -l -f : 向Flash中寫數(shù)據(jù)從RAM指定的位置。
使Flash的配置和控制處于持久穩(wěn)定的狀態(tài)
RedBoot規(guī)定Flash的操作支持在Flash存儲器中的存儲,存儲多次的操作的內(nèi)容和一些非易失性的信息,比如IP地址和一些網(wǎng)絡(luò)的配置信息。
RedBoot第一次被引導(dǎo)到目標板,在平臺上RedBoot支持的配置信息將被報告出現(xiàn)下面的信息:
Flash configuration checksum error or invalid key
如果沒有Flash配置信息,這樣的錯誤能夠被忽視。或者能夠通過運行fconfig命令來改正錯誤,還可以通過fis init命令來改變這個情況。
在不同F(xiàn)lash中,他們的控制和配置信息也是不一樣的,然而配置和控制的命令是一樣的,運行fconfig –l 命令,Flash中的信息能夠被運行和改變。
-i :配置的數(shù)據(jù)庫將要被從新設(shè)置。這需要第一次把RedBoot安裝在目標板上,或者是更新一個新RedBoot運用不同的配置鍵。
-l :配置信息被簡單的列舉。每一個配置參數(shù)將被顯示并且有一個機會去改變它。所有的數(shù)據(jù)能夠被打印,將返回一些被改變的數(shù)據(jù)。布爾數(shù)學(xué)體系的值可能被輸入用第一個字母代替。
如果一些配置被改變,從使用者那里得到確認以后,更新的數(shù)據(jù)將要被寫回Flash。
-n :呢稱是較短的比全名
-f : 全稱被顯示。
進入一個平臺,假若呢稱是一個較快的方式,那么使用的方法是:
RedBoot> fconfig nickname value
如果沒有數(shù)據(jù)被支持,命令僅顯示進入,如果一個數(shù)據(jù)被支持,輸入將要被設(shè)計為哪個數(shù)據(jù)。如果一些數(shù)據(jù)改變,將被提示是否向Flash寫一些新的信息。
RedBoot> fconfig -l -n
boot_script: true
boot_script_data:
.. fis unlock -f 0x50400000 -l 0xa00000
.. fis load -b 0x2000000 zImage
.. fis load -b 0x800000 ramdisk
.. exec 0x2000000
boot_script_timeout: 3
bootp: true
bootp_server_ip: 192.168.0.43
console_baud_rate: 115200
gdb_port: 9000
info_console_force: false
net_debug: false
net_device: npe_eth0
npe_eth0_esa: 0x00:0x0F:0x0E:0x01:0x02:0x03
RedBoot> fconfig bootp_server_ip 192.168.9.190
bootp_server_ip: Setting to 192.168.9.190
Update RedBoot non-volatile configuration - continue (y/n)?y
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
依靠被連接的終端的程序和它的實際能力,當使用默認的fconfig nickname 或者無格式的fconfig,你可能發(fā)現(xiàn)不能使用行編輯命令刪除一些過去的值。
RedBoot> fco bootp
bootp: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
RedBoot> fco bootp
bootp: true
Update RedBoot non-volatile configuration - continue (y/n)? y
... Unlock from 0x50060000-0x50080000: .
... Erase from 0x50060000-0x50080000: .
... Program from 0x07fe0000-0x08000000 at 0x50060000: .
... Lock from 0x50060000-0x50080000: .
在配置的數(shù)值中有一項總是出現(xiàn),在導(dǎo)入的時間這一項能夠執(zhí)行腳本。當系統(tǒng)開始的時間,RedBoot的命令能夠按次序輸入被執(zhí)行。通過控制平臺使用者用普通的命令運行腳本。
在控制臺輸入的字符被明顯的顯示。一旦腳本被執(zhí)行,控制臺將顯示命令執(zhí)行返回的內(nèi)容。
在一些目標板上,RedBoot被配置成在ROM或RAM上運行。所有的RedBoot配置將要執(zhí)行boot腳本,一些特殊情況,RedBoot配置限定執(zhí)行一定的腳本命令是我們想要的。運用預(yù)先考慮好的命令能夠被完成上述的功能,為了啟動哪個指定類型,借助RedBoot配置運行這些命令。
通過RedBoot執(zhí)行程序
運用load或fis load命令把一個映像下載到內(nèi)存中,對于映像執(zhí)行可以是改變。
go :執(zhí)行一個程序。
go [-w time] [-c] [-n] [location] : 在指定的位置開始執(zhí)行。另外,登陸表明最后的映像將要被執(zhí)行。
-w:開始執(zhí)行前使用者等待的時間。當按下ctrl+c執(zhí)行被終止。
-c:開啟高速緩沖存儲器,通常,執(zhí)行g(shù)o命令前高速緩沖存儲器是關(guān)閉的。
-n:RedBoot支持安裝一個網(wǎng)絡(luò)設(shè)備驅(qū)動程序。在執(zhí)行命令前,網(wǎng)絡(luò)界面是不顯示的。
exec :執(zhí)行一個Linux內(nèi)核映像。這個命令不是所有的平臺都可以使用。這個命令被使用執(zhí)行一個沒有操作系統(tǒng)的應(yīng)用程序,尤其像Linux內(nèi)核。命令的執(zhí)行要依靠一定的環(huán)境,比如MMU關(guān)閉,等等。
[-w timeout]
[-b [-l ]]
[-r ]
[-s ]
[-c “kernel command line”] []
Linux內(nèi)核必須被下載到特定的內(nèi)存位置,在RedBoot中心使用這些內(nèi)存。不可能直接把內(nèi)核下栽到哪個位置。
-b:內(nèi)核被下載到內(nèi)存中的位置,當運行exec命令開始前,映像將要被從新部署適當?shù)奈恢谩?/p>
-r,-s:內(nèi)核傳遞的信息,一個靜態(tài)的根文件系統(tǒng)被下載的位置。
-c:內(nèi)核傳遞的原文命令行信息。
閱讀(1059) | 評論(0) | 轉(zhuǎn)發(fā)(0) |
總結(jié)
以上是生活随笔為你收集整理的烧写linux内核的步骤,启动redboot后,向目标机烧写一个linux内核的全过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 2045:【例5.13
- 下一篇: cin gt gt a用c语言怎么写写,