DENX U-Boot及Linux使用手冊(轉)

ba發表於2007-08-16
DENX U-Boot及Linux使用手冊(轉)[@more@]1. 概要
這是嵌入式PowerPC, ARMMIPS系統中使用DENX U-BootLinux的指導手冊。
文件中描述瞭如何在嵌入式PowerPC, ARMMIPS系統上配置、編譯、使用Das U-Boot(常常縮寫為“U-Boot”)和Linux作業系統。
本文件寫於2005年一月至四月四日十四點十五分。
2. 緒論
本文件描述瞭如何在嵌入式PowerPC, ARMMIPS系統上配置、編譯、使用U-BootLinux作業系統。
在這些過程中有太多的步驟,不可能面面俱到、非常深入,但我們會盡力提供所有必需的資訊,能夠讓一個嵌入式系統執行。文件中涵蓋了所有你可能需要的用於配置、編譯、執行U-BootLinux的工具。
首先,我們介紹如何安裝交叉編譯開發工具Embedded Linux Development Kit(ELDK),這個開發套件你很有可能會用到——至少當你在標準的x86 PC上使用Linux或者Sun Solaris系統作為開發環境的時候,你會需要它的。
然後,我們會闡述透過串列埠與你的目標板連線:你需要配置一個終端控制程式,如cu或者kermit
你常常需要透過網線把映像檔案下載到你的目標板上。為了實現這個目的,你需要TFTPDHCP/BOOTP伺服器。文件中提供了簡要的相關配置說明。
接下來則是描述如何配置和編譯U-Boot使之適用於某個特定的平臺,以及如何安裝和在該硬體平臺上執行。
下一步的工作是配置、建立和安裝Linux。我們使用SELF(Simple Embedded Linux Framework)來展示如何建立一個開發環境(包括透過NFS掛載的根檔案系統)和一個嵌入式目標板配置(從基於busyboxramdisk映像檔案中執行)。
本文件不會給出如何把U-Boot或者Linux移植到一個新的硬體平臺,而是預設你的開發板已經被U-BootLinux所支援。
本文件的側重點是針對TQM8xxL開發板。
本手冊各種文件格式的最新版本可以從以下網址獲取:
HTML
PDF
3. 嵌入式Linux開發工具套件
嵌入式Linux開發工具套件(ELDK)包括GNU交叉開發工具,如編譯器、binutilsgdb等工具,和一些已經編譯好的目標工具以及負責提供在目標平臺上函式呼叫的庫檔案。
還免費提供了所有的原始碼,包括全部補丁、擴充套件檔案、以及用於編譯開發工具使用的程式和指令碼。
安裝包都是基於RPM包管理器。
3.1 獲取ELDK
可以透過以下方式獲得ELDK
·DENX計算機系統光碟
·從以下伺服器中下載
FTP方式
ftp://mirror.switch.ch/mirror/eldk/eldk/
ftp://sunsite.utk.edu/pub/linux/eldk/
ftp://ftp.leo.org/pub/eldk/
HTTP方式



3.2 初始安裝
初始安裝可以使用放在ELDK目錄樹根目錄下的安裝工具。安裝工具使用語法如下;
$ ./install [-d ] [] [] ...
-d 確定ELDK安裝在哪個目錄。如果省略ELDK會安裝在當前目錄。
確定目標平臺的CPU。如果此項設定了一項以上的引數,則會將這些CPU的支援都安裝。如果省略將會安裝所有CPU的支援。
你也可以把ELDK安裝到任何空目錄下,這麼做的唯一條件是你有那個目錄的寫和執行許可權。安裝過程並不需要超級使用者的特權。
由安裝時的引數決定安裝幾個目標元件集合。ELDT包是肯定會安裝的。
4. 系統設定
在目標平臺上安裝和配置U-BootLinux需要一些工具。特別是在開發過程中,你需要和目標平臺保持聯絡。這一節將告訴你如何配置你的主機以達到上述目的。
4.1 設定串列埠
為了更好地使用U-BootLinux,你需要透過串列埠將目標板和你的主機連線。U-BootLinux可以配置成自動執行而不需要任何使用者的干涉。
透過串列埠有很多種方法來控制你的目標板,比如說使用終端伺服器。不過最常見的做法是使用你本機的串列埠,這時,你主機需要安裝一個終端程式,如cu或者kermit
4.2 配置“kermit
kermit這個名字就代表了它是連線串列埠和網路的通訊軟體。事實上在很多計算機和作業系統上使用它,能夠很好地滿足我們的目的。
kermit在執行其它命令之前,會執行你的使用者目錄下的初始檔案.kermrc,所以可以非常簡單的透過初始化命令來定製kermit。下面是使用U-BootLinux時推薦配置:
~/.kermrc:
set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5

這個設定假定你使用的是主機第一個串列埠(/dev/ttyS0),以115200這個波特率與目標板的串列埠連線。
然後你可以連線目標板了:
$ kermit -c
Connecting to /dev/ttyS0, speed 115200.
The escape character is Ctrl- (ASCII 28, FS)
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------

下載kermit這個軟體時,你會發現有兩個kermit包。你只需要安裝ckermit。其中gkermit僅僅是實現kermit傳輸協議的一個命令列工具。
如果你主機上的Linux系統沒有安裝kermit,你可以到kerimt的官方網站 下載。
4.3 使用minicom
minicom是另外一種非常流行的串列埠通訊終端。很遺憾的是,很多使用者發現在使用U-BootLinux時,minicom有很多問題,尤其是試圖使用它來下載image的時候。因此,不推薦大家使用minicom
(譯者注:我使用minicom也工作的很好,沒有碰到什麼問題。)
4.4 配置TFTP伺服器
使用U-Boot下載Linux核心或者應用程式的最快捷的方法是透過網路傳輸。為了這一目的,U-Boot實現了TFTP協議(參見U-Boot中的tftpboot命令)。
為了使主機支援TFTP,你必須確保TFTP後臺程式/usr/sbin/in.tftpd已經安裝。在RedHat系統中,你可以執行下面的命令來確認:
$ rpm -q tftp-server
如果沒有安裝,請從你的Linux安裝盤或者其它媒介安裝。
大多數的Linux發行版都預設關閉TFTP服務。以RedHat系統為例,如果要使能TFTP服務,編輯檔案/etc/xinetd.d/tftp,移除這一行:
disable = yes
或者註釋掉它:
# default: off
# description: The tftp server serves files using the trivial file transfer
# protocol. The tftp protocol is often used to boot diskless
# workstations, download configuration files to network-aware printers,
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
# disable = yes
per_source = 11
cps = 100 2
}

此外,確保/tftpboot目錄存在,而且有訪問許可權(至少應該"dr-xr-xr-x")。

5. Das U-Boot
5.1 當前版本
Das U-Boot(或者簡稱“U-Boot”)是針對嵌入式PowerPC, ARM, MIPSx86處理器的開放原始碼軟體。U-Boot專案已經在Sourceforge設立,你可以訪問這個官方網站:
U-Boot最新版的原始碼可以在Sourcefoge透過匿名CVS得到。當要求輸入匿名使用者anonymous的密碼時只需要直接按下Enter鍵。
$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
$ cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot
co -P u-boot
官方釋出的U-Boot也可以透過FTP方式獲取。你可以到

下載tar形式的壓縮包。
5.2 原始碼包的解壓
如果你是透過CVS得到的U-Boot原始碼,你可以跳過這一步,因為你得到的已經是解壓後的目錄樹了。如果你是從FTP伺服器上下載的tar壓縮包,那麼你需要按照以下步驟解壓:
$ cd /opt/eldk/usr/src
$ wget
$ rm -f u-boot
$ bunzip2 < u-boot-0.4.5.tar.bz2 | tar xf -
$ ln -s u-boot-0.4.5 u-boot
$ cd u-boot
5.3 配置
進入U-Boot原始碼根目錄後,可以先使用如下命令確保已經清除以前編譯的結果:
$ make distclean
下一步是為TQM8xxL板配置U-Boot
$ make tqm8xxl_config
(譯者注:應該根據你自己的具體開發板配置,如
$ make _config,如果沒有相應的開發板,應該自己照著建立相應的目錄和配置檔案。)
最後我們可以開始編譯U-Boot了:
$ make all
5.4 安裝
5.4.1 動手之前
5.4.1.1 安裝所需
以下的章節假定你的開發板使用flash作為儲存裝置。如果不是,則以下的指令不會工作。如果你想使用U-Boot,需要換掉儲存裝置。
5.4.1.2 開發板識別資料
所有的TQM8xxL開發板使用一個序列號加以識別。而且開發板需要分配一個乙太網MAC地址。如果這些資料丟失,你可能會失去授權。在安裝U-Boot或者改變開發板的配置之前,你需要蒐集足夠的資訊。
5.4.2 使用BDM/JTAG偵錯程式安裝U-Boot.bin
把資料燒入flash中的一個簡單而又快速的辦法是透過BDM或者JTAG介面的偵錯程式或者flash燒寫器。當flash中沒有任何資料(比如說一塊新的開發板),這種方法是唯一的選擇。
我們(強烈推薦)使用Abatron公司的BDI2000(見 )
其它的BDM/JTAG偵錯程式也可以使用,但是如何操作它們不是本文件要討論的範圍。如果你想使用別的工具請參照它們的說明文件。
譯者注:我沒有使用BDI2000,故略去操作BDI2000的方法。我燒寫u-boot.bin就是簡單地透過JTAG口。甚至我燒寫800kLinux核心都是用JTAG,只要你不嫌慢。)
5.4.3 使用U-Boot安裝U-Boot.bin
如果U-Boot已經在你的板子上安裝執行,你可以使用這些命令來下載新的U-Boot映像來代替當前的。
警告:在你安裝新的映像之前,你必須擦除當前的u-boot.bin。如果出現什麼差錯,你的開發板將不能執行。因此強烈建議:
做一個能工作的U-Boot映像檔案的備份;
你清楚如何在一個新的開發板上安裝u-boot.bin
過程如下:
=> tftp 100000 /tftpboot/uboot.bin
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.100
Filename ''/tftpboot/uboot.bin''.
Load address: 0x100000
Loading: ###############################
done
Bytes transferred = 155376 (25ef0 hex)
=> protect off 40000000 4003FFFF
Un-Protected 5 sectors
=> era 40000000 4003FFFF
Erase Flash from 0x40000000 to 0x4003ffff
......... done
Erased 5 sectors
=> cp.b 100000 40000000 $(filesize)
Copy to Flash... done
=> setenv filesize
=> saveenv
Saving Enviroment to Flash...
Un-Protected 1 sectors
Erasing Flash...
.. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
=> reset
5.5 工具的安裝
U-Boot載入Linux核心、Ramdisk或者其它映像時使用一種特殊的映像格式。這種格式包含了一些資訊,如建立時間、作業系統、壓縮格式、映像型別、映像名和CRC32校驗和。
mkimage用來建立這種格式的映像檔案或者顯示它包含的資訊。如果使用ELDK,那麼mkimage這個命令已經包含在ELDK中。
如果你不想使用ELDK,你應該把mkimage安裝在某個能夠直接執行的目錄裡,比如:
$ cp tools/mkimage /usr/local/bin/
5.6 初始化
初始化你的TQM8xxL板上的U-Boot,你需要透過終端連線板子的串列埠。
TQM8xxL板的串列埠預設配置是波特率為115200/8N1(115200bps,每個字元8bit,無奇偶校驗,1bit停止位,無握手)
如果你的主機是Linux作業系統,我們建議你用kermit或者cu作為終端控制程式。
確定硬體和軟體控制流都已經關閉。
5.7 開始的步驟
在預設配置中,U-Boot執行在一種互動模式,它透過串列埠“COM.1(X.18)”提供命令列形式的使用者介面。
這意味著U-Boot顯示一個提示符(預設是:=>),等待著接受使用者的輸入。然後你輸入一個命令,按下Enter鍵。U-Boot將執行這個命令,然後又出現提示符等待下一條命令。
你可以使用help(或者簡單地一個?)來檢視所有的U-Boot命令。它將會列出在你當前配置下所有支援的命令。[請注意到儘管U-Boot提供了很多配置選項,並不是所有選項都支援各種處理器和開發板,有些選項可能在你的配置中並沒有被選上。]
=> help
askenv - get environment variables from stdin
autoscr - run script from memory
base - print or set address offset
bdinfo - print Board Info structure
bootm - boot application image from memory
bootp - boot image via network using BootP/TFTP protocol
bootd - boot default, i.e., run ''bootcmd''
cmp - memory compare
coninfo - print console devices and informations
cp - memory copy
crc32 - checksum calculation
date - get/set/reset date & time
dhcp - invoke DHCP client to obtain IP/boot params
diskboot- boot from IDE device
echo - echo args to console
erase - erase FLASH memory
flinfo - print FLASH memory information
go - start application at address ''addr''
help - print online help
ide - IDE sub-system
iminfo - print header information for application image
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
nm - memory modify (constant address)
printenv- print environment variables
protect - enable or disable FLASH write protection
rarpboot- boot image via network using RARP/TFTP protocol
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
sleep - delay execution for some time
tftpboot- boot image via network using TFTP protocol
and env variables ipaddr and serverip
version - print monitor version
? - alias for ''help''
=>
使用help 你可以得到更多的命令資訊:
=> help tftpboot
tftpboot [loadAddress] [bootfilename]
=> help setenv printenv
setenv name value ...
- set environment variable ''name'' to ''value ...''
setenv name
- delete environment variable ''name''
printenv
- print values of all environment variables
printenv name ...
- print value of environment variable ''name''
=>
大多數命令可以縮寫,只要字串的內容仍然可以被確定:
=> help fli tftp
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
tftpboot [loadAddress] [bootfilename]
=>
5.8 首次上電
注意:如果你購買的TQM8xxL板已經安裝了U-Boot,你可以跳過這節,因為製造商已經完成這些步驟了。
把主機指定的串列埠和在TQM8xxL板上標有“COM.1(X.18)”的埠連線,執行終端程式,給TQM8xxL板接上電源。你可以看到如下資訊:
Connecting to /dev/ttyS1, speed 115200.
The escape character is Ctrl- (ASCII 28, FS)
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
PPCBoot 1.1.5 (Mar 21 2002 - 19:55:04)
CPU: XPC860xxZPnnD3 at 50 MHz: 16 kB I-Cache 8 kB D-Cache FEC present
Board: TQM860LDDBA3-P50.203
DRAM: 64 MB
FLASH: 8 MB
In: serial
Out: serial
Err: serial
PCMCIA: No Card found
Type "run flash_nfs" to mount root filesystem over NFS
Hit any key to stop autoboot: 0
=>
你可以按下任意鍵來中止倒計數。如果你不那麼做,你可能會看到一些(無關緊要的)錯誤,因為系統沒有初始化。
有時你可能會看到一種資訊:
*** Warning - bad CRC, using default environment
這條資訊沒有害處,只要你初始化和儲存環境變數之後,它就不會出現了。
首先,你必須輸入你的開發板的序列號和網路卡地址。需要特別注意的是,這些引數是防寫的,一旦儲存了就無法改變(通常製造商已經設定好了)。使用U-Bootsetenv命令可以輸入資料,命令後面跟上變數名和值,引數之間用空格(或者Tab符)隔開。例如,使用變數名serial#設定開發板的ID或者說序列號,變數名ethaddr用於設定乙太網地址:
=> setenv serial# TQM860LDB0A3-P.200 10061684 4
=> setenv ethaddr 00:D0:93:00:05:B5
使用printenv確認你已經輸入正確的值:
=> printenv serial# ethaddr
serial#=TQM860LDDBA3-P50.203 10226122 4
ethaddr=00:D0:93:00:28:81
=>
請仔細核查顯示值是否正確!等儲存之後你將不能更正任何錯誤。如果發現錯誤,請重新啟動開發板。如果檢查無誤,你可以使用saveenv命令永久儲存這些引數。
=> saveenv
Saving Enviroment to Flash...
Un-Protected 1 sectors
Erasing Flash...
. done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
=>
5.9 U-Boot命令介紹
這一節將介紹U-Boot中最重要的指令。U-Boot可配置性非常強,所以並不是所有的命令都已經在你的硬體平臺上安裝,此外可能也有這兒沒提到的命令。你可以使用help命令來顯示根據你的配置所有可用的命令列表。
對於大多數命令,你不必打全這些命令,只需輸入一些字元足以。比如,help可以簡寫為h
一些命令的執行依賴於U-Boot的配置以及U-Boot中一些環境變數的定義。
所有的U-Boot命令都把輸入的數字當作十六進位制的格式。
不要使用除了退格鍵之外的其它編輯鍵,因為在諸如環境變數中隱藏的字元是很難被發現的。
5.9.1 資訊類命令
5.9.1.1 bdinfo – 顯示開發板資訊
=> help bdinfo
bdinfo - No help available.
=>
bdinfo命令(簡寫為bdi)將在終端顯示諸如記憶體地址和大小、時脈頻率、MAC地址等資訊。這些資訊在傳遞給Linux核心一些引數時會用到。
=> bdi
memstart = 0x00000000
memsize = 0x04000000
flashstart = 0x40000000
flashsize = 0x00800000
flashoffset = 0x00030000
sramstart = 0x00000000
sramsize = 0x00000000
immr_base = 0xFFF00000
bootflags = 0x00000001
intfreq = 50 MHz
busfreq = 50 MHz
ethaddr = 00:D0:93:00:28:81
IP addr = 10.0.0.99
baudrate = 115200 bps
=>
5.9.1.2 coninfo – 顯示控制檯裝置和資訊
=> help conin
coninfo
=>
coninfo命令 (簡寫為conin) 顯示可用的控制I/O裝置資訊。
=> conin
List of available devices:
serial 80000003 SIO stdin stdout stderr
=>
輸出包括了裝置名、標識和當前使用情況。以此為例:
serial 80000003 SIO stdin stdout stderr
這個輸出結果意為串列埠裝置是一個系統裝置(標誌‘S’),它提供輸入(標誌‘I’)和輸出(標誌‘O’)功能,而且當前已經指派給3個標準I/O流:tdinstdout stderr
5.9.1.3 flinfo – 顯示Flash儲存資訊
=> help flinfo
flinfo
- print information for all FLASH memory banks
flinfo N
- print information for FLASH memory bank # N
=>
flinfo命令 (簡寫為fli) 用於獲取可用的flash儲存資訊(參見後面的Flash儲存命令)。
=> fli
Bank # 1: FUJITSU AM29LV160B (16 Mbit, bottom boot sect)
Size: 4 MB in 35 Sectors
Sector Start Addresses:
40000000 (RO) 40008000 (RO) 4000C000 (RO) 40010000 (RO) 40020000 (RO)
40040000 40060000 40080000 400A0000 400C0000
400E0000 40100000 40120000 40140000 40160000
40180000 401A0000 401C0000 401E0000 40200000
40220000 40240000 40260000 40280000 402A0000
402C0000 402E0000 40300000 40320000 40340000
40360000 40380000 403A0000 403C0000 403E0000
Bank # 2: FUJITSU AM29LV160B (16 Mbit, bottom boot sect)
Size: 4 MB in 35 Sectors
Sector Start Addresses:
40400000 40408000 4040C000 40410000 40420000
40440000 40460000 40480000 404A0000 404C0000
404E0000 40500000 40520000 40540000 40560000
40580000 405A0000 405C0000 405E0000 40600000
40620000 40640000 40660000 40680000 406A0000
406C0000 406E0000 40700000 40720000 40740000
40760000 40780000 407A0000 407C0000 407E0000
=>
5.9.1.4 iminfo – 顯示映像檔案頭部資訊
=> help iminfo
iminfo addr [addr ...]
- print header information for application image starting at
address ''addr'' in memory; this includes verification of the
image contents (magic number, header and payload checksums)
=>
iminfo (簡寫為imi) 用於顯示像Linux核心或者ramdisk之類的映像檔案的頭部資訊。 它顯示映像名、型別、大小以及CRC32校驗和以驗證檔案沒問題。
=> imi 100000
## Checking Image at 00100000 ...
Image Name: Linux-2.4.4
Created: 2002-04-07 21:31:59 UTC
Image Type: PowerPC Linux Kernel Image (gzip compressed)
Data Size: 605429 Bytes = 591 kB = 0 MB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
=>
跟其它很多命令一樣,imi命令的精確操作可由U-Boot的一些環境變數控制(這兒的是變數verify)。參見後面的詳細介紹。
5.9.1.5 help – 顯示線上幫助
=> help help
help [command ...]
- show help information (for ''command'')
''help'' prints online help for the monitor commands.
Without arguments, it prints a short usage message for all commands.
To get detailed help information for specific commands you can type
''help'' with one or more command names as arguments.
=>
help指令(簡寫為h或者?)顯示線上幫助。如果不加任何引數,它會列印出所有當前U-Boot可用命令列表。你可以把某一指令名作為help的引數來獲得這一命令的具體資訊。比如:
=> help protect
protect on start end
- protect FLASH from addr ''start'' to addr ''end''
protect on N:SF[-SL]
- protect sectors SF-SL in FLASH bank # N
protect on bank N
- protect FLASH bank # N
protect on all
- protect all FLASH banks
protect off start end
- make FLASH from addr ''start'' to addr ''end'' writable
protect off N:SF[-SL]
- make sectors SF-SL writable in FLASH bank # N
protect off bank N
- make FLASH bank # N writable
protect off all
- make all FLASH banks writable
=>
5.9.2 儲存類指令
5.9.2.1 base – 顯示或者設定地址偏移
=> help base
base
- print address offset for memory commands
base off
- set address offset for memory commands to ''off''
=>
你可以使用base命令(簡寫為ba)來顯示或者設定一個“基地址”作為所有儲存類命令的地址偏移值。預設的基址是0,所以你輸入的所有地址都是實地址。但是,當你重複訪問某一特定儲存區域(如一些嵌入式PowerPc處理器的記憶體)時,如果設定此區域的開始地址作為基址,只需使用偏移地址,這將非常簡便:
=> base
Base Address: 0x00000000
=> md 0 c
00000000: feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x
00000010: 3cfb3b78 3b000000 7c0002e4 39000000 <.>
00000020: 7d1043a6 3d000400 7918c3a6 3d00c000 }.C.=...y...=...
=> base 40000000
Base Address: 0x40000000
=> md 0 c
40000000: 27051956 50504342 6f6f7420 312e312e ''..VPPCBoot 1.1.
40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
40000020: 2031393a 35353a30 34290000 00000000 19:55:04)......
=>
5.9.2.2 crc32 – 校驗和計算
crc32(簡寫為crc)用來計算在某一範圍記憶體儲區域的CRC32校驗和。
=> crc 100004 3FC
CRC32 for 00100004 ... 001003ff ==> d433b05b
=>
當後面加了3個引數時,此命令會把計算結果儲存在給定儲存地址內。
=> crc 100004 3FC 100000
CRC32 for 00100004 ... 001003ff ==> d433b05b
=> md 100000 4
00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8''.<.....>
=>
可以看到,CRC32的校驗和不僅顯示出來了,還儲存在地址為0x10000000的儲存單元裡。
5.9.2.3 cmp – 儲存單元比較
=> help cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
=>
使用cmp命令你可以比較兩個儲存區域的內容是否一致。這個命令不僅可以測試由第3個引數確定的整個區域,還可以在第一個不同的地方停下來。
=> cmp 100000 40000000 400
word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
Total of 1 word were the same
=> md 100000 C
00100000: 27051956 50ff4342 6f6f7420 312e312e ''..VP.CBoot 1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
=> md 40000000 C
40000000: 27051956 50504342 6f6f7420 312e312e ''..VPPCBoot 1.1.
40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
40000020: 2031393a 35353a30 34290000 00000000 19:55:04)......
=>
跟很多的儲存類命令一樣,cmp可以採用不同的長度訪問儲存器:可以是32bit(長字),16bit()或者8bit(位元組)資料。預設使用32bit,或者使用cmp.l代替,結果是一樣的。如果你想以16bit或者字資料訪問儲存器,你可以用cmp.w代替;如果是8bit或者位元組資料,請用cmp.b
必須注意到計數引數確定了需要被處理的資料的總長度,也就是有多少長字、字或者位元組需要被比較。
=> cmp.l 100000 40000000 400
word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
Total of 1 word were the same
=> cmp.w 100000 40000000 800
halfword at 0x00100004 (0x50ff) != halfword at 0x40000004 (0x5050)
Total of 2 halfwords were the same
=> cmp.b 100000 40000000 1000
byte at 0x00100005 (0xff) != byte at 0x40000005 (0x50)
Total of 5 bytes were the same
=>
5.9.2.4 cp – 儲存器複製
=> help cp
cp [.b, .w, .l] source target count
- copy memory
=>
cp用來複制儲存單元。
=> cp 40000000 100000 10000
=>
cp 可以使用型別識別符號 .l , .w.b
5.9.2.5 md – 顯示儲存單元內容
=> help md
md [.b, .w, .l] address [# of objects]
- memory display
=>
md採用十六進位制和ASCII碼兩種形式來顯示儲存單元的內容。
=> md 100000
00100000: 27051956 50504342 6f6f7420 312e312e ''..VPPCBoot 1.1.
00100010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020: 2031393a 35353a30 34290000 00000000 19:55:04)......
00100030: 00000000 00000000 00000000 00000000 ................
00100040: 00000000 00000000 00000000 00000000 ................
00100050: 00000000 00000000 00000000 00000000 ................
00100060: 00000000 00000000 00000000 00000000 ................
00100070: 00000000 00000000 00000000 00000000 ................
00100080: 00000000 00000000 00000000 00000000 ................
00100090: 00000000 00000000 00000000 00000000 ................
001000a0: 00000000 00000000 00000000 00000000 ................
001000b0: 00000000 00000000 00000000 00000000 ................
001000c0: 00000000 00000000 000000

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-960978/,如需轉載,請註明出處,否則將追究法律責任。

相關文章