烧写linux内核的步骤,启动redboot后,向目标机烧写一个linux内核的全过程
命令說明
對一個沒有內核和根文件系統的板子是不可以運轉的,當通過一種方式下載了RedBoot引導程序以后,我們可以通過下面的方式下載內核和根文件系統。
在本系統中,我們對內核和根文件系統的下載是通過tftp服務完成的。
整個Flash空間是16M ,它的地址范圍:0x50000000 – 0x50fe0000 ,共有128塊,每一塊的大小是128K 。0x50000000 – 0x50080000范圍放的是RedBoot引導程序和各種配置,0x50080000 – 0x50200000范圍放的是Linux內核zImage,0x50200000 – 0x50380000范圍放的是根文件系統ramdisk,0x50380000 – 0x50f60000范圍放的是jffs2文件格式。剩余0x50f60000---0x50fe0000范圍的512K空間放日志系統.
以下過程為啟動redboot后,向目標機燒寫一個linux內核的全過程
先對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分區信息
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.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)? (出現此提示時,請輸入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
到這里整個燒寫過程結束。
RedBoot可以在多種不同配置下運行,但一般都是從目標平臺的閃存引導區或引導ROM啟動。RedBoot設計為系統上電啟動,能提供完整的處理器初始化和設備設置,使設計人員能夠迅速開始與系統通信。
出現 RedBoot>
后,就表明redboot已經準備好,用戶可以開始輸入命令。
RedBoot命令的基本格式是:
命令 [-選項1] [-選項2 參數值] 操作符
命令格式中的選項1和選項2代表可以加到某些命令中的可選參數,用于指示一些特定動作或附加信息,在選項2中還包括一個數值。操作符定義了某些特殊命令所需的附加信息。命令也可以縮寫成最短的無歧義字符串,如dump、dum、du和d都是dump命令的有效寫法。
RedBoot用load命令下載應用軟件映像,映像可以用TFTP協議、X/Y調制解調器協議或直接從目標硬件下載。
RedBoot常用的幾條命令:
首先是閃存映像系統(fis)命令,當硬件平臺上配有閃存時,RedBoot提供fis命令作為基本文件系統,這些命令主要用來管理文件系統映像。
另一個有用的命令是基于閃存的配置和控制命令fconfig。用fconfig命令查詢的輸出信息,配置命令可以設置RedBoot啟動順序。啟動配置包括是否在初始化期間運行引導腳本、是否用BOOTP協議獲取IP地址等等。
RedBoot支持引導腳本,因此允許用戶在上電過程完成后執行所需命令。在產品測試階段采用RedBoot裝載應用軟件映像時引導腳本很有好處,用戶還可以設置超時參數,在引導腳本執行前按下Ctrl+C中斷執行。引導腳本可用fconfig命令進行設置。
RedBoot命令介紹:
引用一個別名,如為joe的別名為This is Joe
RedBoot> alias joe "This is Joe"
設置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的版本,使用平臺,內存和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 : 用指定的方式向向存儲器中寫數據。
Mfill {-b location} {-l length} {-p value} [-1 | -2| -4]
-b : 存儲器中,被寫入數據的起始地址。
-l :被寫入數據的長度。
-p :被寫入數據的內容。
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引導到Flash中。運行的對象,包括一些數據還有一些簡單的文件也能夠存放到Flash中。fis 這個命令能夠被使用運行Flash中的內容。
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的名字運行,另外一些能夠被使用者執行。
-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 目錄中創造一個image,image中的數據在拷貝之前必須存在在RAM存儲器中。(首先,使用load命令把image下載到RAM中,然后運用fis create命令把他寫入Flash中。)
name :文件的名字,顯示在FIS 目錄中。
-b :在RAM中的一個位置,為了得到image,這是一個必須的參數。
-l :image的長度。如果image已經存在,那么它的長度被推斷根據先前image被創造的時間。特殊的情況下,它可能和原來的初始化的數據是一樣的。
-f :image在Flash中的位置。一般情況下,位置被確定根據現在的image所在的位置,如果在Flash還沒有image的存在,那么剩余的塊是足夠的被使用。
-e :執行登陸的地址。如果image的開始地址不知道或者是不需要被考慮,-e被使用。
-r :當image通過fis load命令下載在RAM 中的位置。但是在這里要求這個image是給定的。
-s :被寫入Flash數據的真實的長度,如果不能出現,那么image的長度是假定的,-s比-l給出的數據要短一些,
-n :僅僅更新FIS的目錄,沒有數據被拷貝從RAM到Flash中,這個特點能夠被使用登陸FIS,如果它已經壞掉。
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命令執行。如果加上-b參數,image被拷貝從Flash到RAM 的指定的位置,如果不加上-b參數,image被拷貝從Flash到image被創造的地址。
-name :一個顯示在FIS 目錄中的文件名。
-b :存儲器中,被寫入數據的開始地址。
-c :下載到存儲器之后計算并打印image數據的校驗和。
-d :當拷貝image從Flash到RAM 時減壓縮它。
RedBoot> fis load RedBoot
RedBoot> go
執行linux 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扇區,預防意外的重寫image。為了對Flash進行一些更改,一個匹配的開啟命令必須是有的,
RedBoot> fis lock -f 0x50090000 -l 0x20000
... Lock from 0x50080000-0x500b0000: ..
fis unlock –f -l : 開啟一部分Flash扇區,允許這部分扇區被更新,這部分區域一定是被寫保護過的。
RedBoot> fis unlock -f 0x50090000 -l 0x20000
... Unlock from 0x50090000-0x500b0000: ..
fis erase –f -l : 檫除一部分Flash扇區,沒有被檫除的那部分Flash扇區是不能被下載image的。
RedBoot> fis erase –f 0x50090000 –l 0x20000
…Erase from 0x50090000 – 0x500b0000:..
fis write –b -l -f : 向Flash中寫數據從RAM指定的位置。
使Flash的配置和控制處于持久穩定的狀態
RedBoot規定Flash的操作支持在Flash存儲器中的存儲,存儲多次的操作的內容和一些非易失性的信息,比如IP地址和一些網絡的配置信息。
RedBoot第一次被引導到目標板,在平臺上RedBoot支持的配置信息將被報告出現下面的信息:
Flash configuration checksum error or invalid key
如果沒有Flash配置信息,這樣的錯誤能夠被忽視。或者能夠通過運行fconfig命令來改正錯誤,還可以通過fis init命令來改變這個情況。
在不同Flash中,他們的控制和配置信息也是不一樣的,然而配置和控制的命令是一樣的,運行fconfig –l 命令,Flash中的信息能夠被運行和改變。
-i :配置的數據庫將要被從新設置。這需要第一次把RedBoot安裝在目標板上,或者是更新一個新RedBoot運用不同的配置鍵。
-l :配置信息被簡單的列舉。每一個配置參數將被顯示并且有一個機會去改變它。所有的數據能夠被打印,將返回一些被改變的數據。布爾數學體系的值可能被輸入用第一個字母代替。
如果一些配置被改變,從使用者那里得到確認以后,更新的數據將要被寫回Flash。
-n :呢稱是較短的比全名
-f : 全稱被顯示。
進入一個平臺,假若呢稱是一個較快的方式,那么使用的方法是:
RedBoot> fconfig nickname value
如果沒有數據被支持,命令僅顯示進入,如果一個數據被支持,輸入將要被設計為哪個數據。如果一些數據改變,將被提示是否向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,你可能發現不能使用行編輯命令刪除一些過去的值。
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: .
在配置的數值中有一項總是出現,在導入的時間這一項能夠執行腳本。當系統開始的時間,RedBoot的命令能夠按次序輸入被執行。通過控制平臺使用者用普通的命令運行腳本。
在控制臺輸入的字符被明顯的顯示。一旦腳本被執行,控制臺將顯示命令執行返回的內容。
在一些目標板上,RedBoot被配置成在ROM或RAM上運行。所有的RedBoot配置將要執行boot腳本,一些特殊情況,RedBoot配置限定執行一定的腳本命令是我們想要的。運用預先考慮好的命令能夠被完成上述的功能,為了啟動哪個指定類型,借助RedBoot配置運行這些命令。
通過RedBoot執行程序
運用load或fis load命令把一個映像下載到內存中,對于映像執行可以是改變。
go :執行一個程序。
go [-w time] [-c] [-n] [location] : 在指定的位置開始執行。另外,登陸表明最后的映像將要被執行。
-w:開始執行前使用者等待的時間。當按下ctrl+c執行被終止。
-c:開啟高速緩沖存儲器,通常,執行go命令前高速緩沖存儲器是關閉的。
-n:RedBoot支持安裝一個網絡設備驅動程序。在執行命令前,網絡界面是不顯示的。
exec :執行一個Linux內核映像。這個命令不是所有的平臺都可以使用。這個命令被使用執行一個沒有操作系統的應用程序,尤其像Linux內核。命令的執行要依靠一定的環境,比如MMU關閉,等等。
[-w timeout]
[-b [-l ]]
[-r ]
[-s ]
[-c “kernel command line”] []
Linux內核必須被下載到特定的內存位置,在RedBoot中心使用這些內存。不可能直接把內核下栽到哪個位置。
-b:內核被下載到內存中的位置,當運行exec命令開始前,映像將要被從新部署適當的位置。
-r,-s:內核傳遞的信息,一個靜態的根文件系統被下載的位置。
-c:內核傳遞的原文命令行信息。
閱讀(1059) | 評論(0) | 轉發(0) |
總結
以上是生活随笔為你收集整理的烧写linux内核的步骤,启动redboot后,向目标机烧写一个linux内核的全过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 2045:【例5.13
- 下一篇: cin gt gt a用c语言怎么写写,