?
|
|
級(jí)別: 初級(jí)
陳渝
(yuchen@tsinghua.edu.cn)清華大學(xué)
2004 年 9 月 01 日
?
一. SkyEye配置選項(xiàng)
SkyEye模擬的硬件配置和模擬執(zhí)行行為由配置文件skyeye.conf中的選項(xiàng)確定。根據(jù)選項(xiàng)的功能,skyeye.conf的選項(xiàng)分為硬件配置選項(xiàng)和模擬執(zhí)行選項(xiàng)。根據(jù)參數(shù)的個(gè)數(shù),skyeye.conf的選項(xiàng)主要由兩種組成:
- 單參數(shù)選項(xiàng)行
格式為:
symbol: value
symbol可以是硬件定義,如cpu、mach等,也可以是執(zhí)行控制定義,如log等。
value是symbol對(duì)應(yīng)的值,可能是數(shù)字也可能是字符串。
- 多參數(shù)選項(xiàng)行
格式為:
symbol:opt1=value1,opt2=value2,......
opt1是參數(shù)名,value1是opt1對(duì)應(yīng)的值,可能是數(shù)字也可能是字符串。
目前skyeye.conf的配置定義如下:
- 基本CPU核配置選項(xiàng)
目前存在的選項(xiàng)有:arm710、arm7tdmi、arm720t、arm920t、sa1100、sa1110、xscale
格式為
cpu: cpuname
注:cpuname表示一個(gè)代表cpu名字的字符串。
例如:
cpu: arm7tdmi
- 具體的開(kāi)發(fā)板(包括CPU擴(kuò)展)配置選項(xiàng)
目前存在的選項(xiàng)有:at91、ep7312、adsbitsy,pxa_Lubbock、lpc、s3c4510b、s3c44b0、cs89712、sa1100、at91rm92、sharp_lh7a400
格式為:
mach: machinename
注:cpuname表示一個(gè)代表基于特定CPU的開(kāi)發(fā)板名字的字符串。
例如:
mach: at91
- 內(nèi)存組配置選項(xiàng)
一個(gè)內(nèi)存組內(nèi)的地址是連續(xù)的,類(lèi)型分為RAM SPACE, ROM SPACE, mapped IO SPACE
格式為:
mem_bank: map=M|I, type=RW|R, addr=0xXXXXXXXX, size=0xXXXXXXXX,file=imagefilename,boot=yes|no
- map=M 表示 RAM/ROM SPACE, map=I 表示 mapped IO SPACE。
- type=RW ,且如果map=M則表示RAM SPACE, type=R,且如果map=M則表示ROM SPACE。
- addr=0xXXXXXX 表示內(nèi)存組的起始物理地址(32bit,16進(jìn)制)。
- size =0xXXXXXX 表示內(nèi)存組的大小(32bit,16進(jìn)制) 。
- file =imagefilename
file的值imagefilename是一個(gè)字符串,實(shí)際上表示了一個(gè)文件,一般是一個(gè)可以執(zhí)行的binary image格式的可執(zhí)行程序或OS內(nèi)核文件或是一個(gè)binary image格式的根文件系統(tǒng)。如果存在這個(gè)文件,SkyEye會(huì)把文件的內(nèi)容直接寫(xiě)到對(duì)應(yīng)的模擬內(nèi)存組地址空間中。
- boot=yes/no,如果boot=yes,則SkyEye會(huì)把模擬硬件啟動(dòng)后的第一條指令的地址定位到對(duì)應(yīng)的內(nèi)存組的起始地址。
例如:
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x10000000, size=0x00000800, file=./loader.bin,boot=yes
- 網(wǎng)絡(luò)芯片8019AS的配置
格式為 nic: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
注:xx表示兩位16進(jìn)制數(shù),dd表示兩位10進(jìn)制數(shù)
- state表示模擬開(kāi)始后,網(wǎng)絡(luò)芯片是否開(kāi)始工作
- mac表示模擬的nic的mac地址
- ethmod表示skyeye所處主機(jī)上的網(wǎng)絡(luò)模擬方式, 目前有tuptap和vnet兩種模式。tuntap是linux kernel支持的一個(gè)點(diǎn)到點(diǎn)虛擬網(wǎng)絡(luò)實(shí)現(xiàn),vnet是skyeye實(shí)現(xiàn)的一個(gè)功能更多的一個(gè)基于虛擬HUB的網(wǎng)絡(luò)。
- hostip表示主機(jī)方與skyeye交互用的ip地址
例如:
net: state=on, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1
- LCD的配置
格式為 lcd: state=on/off
state=on表示LCD處于接通狀態(tài); state=off 表示LCD處于關(guān)閉狀態(tài)。
例如:
lcd: state=on
- skyeye的UART控制選項(xiàng)
uart選項(xiàng)可以控制skyeye在另一個(gè)與某個(gè)串口連接的終端上輸入/輸出字符
格式:
uart: fd_in=indevname, fd_out=outdevname
- fd_in=indevname indevname表示用于輸入的設(shè)備文件名,其值為實(shí)際的串口設(shè)備文件/dev/ttySx
- fd_out=outdevname outdevname表示用于輸出的設(shè)備文件名,其值為實(shí)際的串口設(shè)備文件/dev/ttySx
例如:
uart: fd_in=/dev/ttyS0, fd_out=/dev/ttyS0
- skyeye的log控制選項(xiàng)
log選項(xiàng)用于控制skyeye輸出硬件系統(tǒng)的執(zhí)行狀態(tài)信息,包括每次執(zhí)行指令時(shí)的執(zhí)行指令值、寄存器值、各種硬件狀態(tài)等。
格式:
log: logon=0|1, logfile=filename, start=number1, end=number2, length=number3
- logon=0|1|2|3,如果值等于0表示不進(jìn)行記錄,如果值等于1表示記錄指令和指令地址流,如果值等于2表示記錄指令和指令地址和主要寄存器內(nèi)容,如果值等于3表示記錄指令和指令地址和所有的寄存器內(nèi)容。
- logfile=filename 其值是一個(gè)字符串,表示用于記錄信息的文件名
- start=number1 其值是一個(gè)>=0的十進(jìn)制整數(shù),表示系統(tǒng)執(zhí)行到第number1條指令時(shí)開(kāi)始進(jìn)行記錄
- end =number2其值是一個(gè)>=0的十進(jìn)制整數(shù),表示系統(tǒng)執(zhí)行到第number2條指令時(shí)停止記錄
- length =number3其值是一個(gè)>=0的十進(jìn)制整數(shù),表示只記錄系統(tǒng)最近執(zhí)行的number3條指令時(shí)的信息
格式:
log: logon=0, logfile=/tmp/sk1.log, start=100000, end=200000, length=100
圖 0 1 SkyEye硬件模擬邏輯結(jié)構(gòu)圖

SkyEye目標(biāo)模擬模塊模擬的硬件邏輯結(jié)構(gòu)圖如圖 0-1所示。
|
|
二. 安裝使用SkyEye
1. SkyEye的安裝
目前SkyEye在Linux操作系統(tǒng)下運(yùn)行得很好, SkyEye通過(guò)MingW或cywgin軟件也可以在Windows環(huán)境中運(yùn)行。
下面我們以在RedHat 9.0環(huán)境的SkyEye安裝為例:
首先需要從解開(kāi)skyeye-x.x.x.src.tar.bz2軟件包(x.x.x代表SkyEye的版本號(hào))開(kāi)始,按照軟件包中的SkyEye.README或README文件中介紹的步驟進(jìn)行(下面命令中的"#"是shell提示符,用戶(hù)不用輸入):
(1) 解壓源碼包(假定skyeye-x.x.x.src.tar.bz2放在本機(jī)的"/usr/src"目錄下),會(huì)在當(dāng)前目錄生成一個(gè)skyeye的目錄
#cd /usr/src
# tar xjvf skyeye-x.x.x.src.tar.bz2
(2) 進(jìn)入解壓SkyEye目錄,配置SkyEye
#cd skyeye
如果是SkyEye 0.6.0以前的版本,運(yùn)行下面的命令進(jìn)行配置:
# ./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
如果你的SkyEye版本大于0.6.0,則帶有LCD仿真支持。為了增加對(duì)LCD仿真的支持,則運(yùn)行如下命令:
# ./configure --target=arm-elf --prefix=/usr/local
(3) 然后是編譯和安裝(正確執(zhí)行完下面的指令且命令正常結(jié)束后,系統(tǒng)中的/usr/local/bin/skyeye 執(zhí)行程序就是安裝好的SkyEye軟件。)
# make
# make install
在編譯安裝過(guò)程中,須注意以下幾點(diǎn):
- 如果你使用的是Mandrake Linux,那么有可能你在編譯SkyEye時(shí)會(huì)出現(xiàn)有關(guān)readline, ncurse, termcap等庫(kù)的一些錯(cuò)誤,那么你需要運(yùn)行下面的命令:
ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h
- 然后再重新編譯
- 如果你使用的是Debian Linux, 不要用gcc 2.95 或 gcc 3.0, 要使用gcc 3.2或更高版本。
- 在你系統(tǒng)中所使用的gcc 版本號(hào)應(yīng)該要大于或等于2.96
- 如果SkyEye版本號(hào)大于0.6.0, 那么你需要在你的系統(tǒng)中安裝GTK (LCD模擬要用到) 。
2. SkyEye的使用
下面我們以SkyEye模擬基于Atmel AT91X40的開(kāi)發(fā)板,并運(yùn)行μClinux為例來(lái)講解SkyEye的具體使用。
第1步 安裝交叉編譯環(huán)境并配置μClinux
先安裝交叉編譯器。注意這里最好用root用戶(hù)來(lái)執(zhí)行如下操作。將arm-elf-tools-20011219.tar.gz(20011219是該工具的產(chǎn)生時(shí)間,也可以選擇更新的arm-elf-tools。)在本機(jī)的根目錄下用tar命令解開(kāi)(假定arm-elf-tools-20011219.tar.gz放在本機(jī)的根目錄"/"下)。具體命令(下面命令中的"#"是shell提示符,用戶(hù)不用輸入)如下:
#cd /
# tar /zxvf arm-elf-tools-20011219.tar.gz
然后將uClinux-dist-20020927.tar.gz(假定該軟件包放在本機(jī)的根目錄下)解開(kāi),比如解開(kāi)在/usr/src/uClinux-dist/下,需要執(zhí)行如下命令:
# cd /usr/src
# tar zxvf /uClinux-dist-20020927.tar.gz
然后在/usr/src/uClinux-dist/目錄下執(zhí)行如下命令:
- 在圖形方式下可用命令
# make xconfig
- 在命令行方式下可用命令
# make menuconfig
在這兩種界面下,在vendor/product選項(xiàng)中選擇GDB/ARMulator,kernel版本選擇2.4.x,其它選項(xiàng)不變,然后保存配置退出,即選擇save and exit選項(xiàng)。
第2步 編譯生成μClinux和包含應(yīng)用程序的文件系統(tǒng)
方案A
如果要生成帶調(diào)試信息的linux kernel執(zhí)行文件,在第一步執(zhí)行完后,繼續(xù)執(zhí)行如下命令:
# make dep; make linux
這時(shí)在/usr/src/uClinux-dist/linux-2.4.x目錄下生成具有ELF執(zhí)行文件格式的linux內(nèi)核文件。到這一步還沒(méi)有生成文件系統(tǒng),為了生成文件系統(tǒng),還需要執(zhí)行如下命令:
# make romfs; make image
如果在/usr/src/uClinux-dist/images/下存在文件 romfs.img,表示文件系統(tǒng)生成成功。
方案B
如果想一步生成帶調(diào)試信息的linux kernel執(zhí)行文件和linux kenel 執(zhí)行文件映像和磁盤(pán)映像文件romfs.img,可簡(jiǎn)單地運(yùn)行命令:
# make dep; make
就行了。可查看/usr/src/uClinux-dist/images/下是否有文件 romfs.img等在/usr/src/uClinux-dist目錄下,如果有,表示編譯安裝成功。
第3步 用SkyEye運(yùn)行和調(diào)試μClinux內(nèi)核
假定SkyEye的工作目錄位于/usr/src/uClinux-dist下,首先要進(jìn)行一些準(zhǔn)備工作:
在工作目錄下建立專(zhuān)門(mén)用于基于AT91X40開(kāi)發(fā)板的SkyEye硬件配置文件skyeye.conf。一個(gè)簡(jiǎn)單的方法是從SkyEye軟件包中的README文件中截取一塊內(nèi)容(以"FOR AT91 (1) special for uclinux"開(kāi)始的一行,從它下面第三行開(kāi)始截取,共取9行)作為skyeye.conf的內(nèi)容,具體內(nèi)容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
|
這樣我們可以通過(guò)如下命令看看在/usr/src/uClinux-dist目錄下的skyeye.conf文件是否與上面的內(nèi)容一致:
# more /usr/src/uClinux-dist/skyeye.conf
然后是建立文件系統(tǒng)的聯(lián)接,需要在目錄/usr/src/uClinux-dist目錄下執(zhí)行如下命令:
#ln -s images/romfs.img boot.rom
這主要是與skyeye.conf中的內(nèi)容保持一致,大家可注意skyeye.conf中的第5行。
完成上述準(zhǔn)備工作后,就可以用SkyEye來(lái)運(yùn)行和調(diào)試μClinux內(nèi)核了,我們可以嘗試如下命令("#"和"(SkyEye)"后面跟著的字符串是需要使用者輸入的):
# cd /usr/src/uClinux-dist
# /usr/local/bin/skyeye linux-2.4.x/linux
(SkyEye)target sim
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x813ebc0
SKYEYE: use arm7100 mmu ops
Loaded ROM ./boot.rom
Connected to the simulator.
(SkyEye)load
Loading section .init, size 0xa000 vma 0x1000000
Loading section .text, size 0xc5cb0 vma 0x100a000
Loading section .data, size 0x8320 vma 0x10d0000
Start address 0x1000000
Transfer rate: 7077504 bits/sec.
(SkyEye)run
Starting program: /usr/src/uClinux-dist/linux-2.4.x/linux
Linux version 2.4.19-uc1 (root@hpclab.cs.tsinghua.edu.cn) (gcc version 2.95.3 20010315 (release)
(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
http://www.snapgear.com/)) #1 Sun Sep 5 12:00:39 HKT 2004
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
……
|
你還可以在run之前給kernel設(shè)置斷點(diǎn)來(lái)調(diào)試。
在使用SkyEye時(shí)要注意以下幾點(diǎn):
a .注意要在 memmap.conf(skyeye-0.2以前版本的配置文件)或skyeye.conf(skyeye-0.2以后版本的配置文件)和boot.rom所在目錄下執(zhí)行skyeye。
b. memmap.conf 和 skyeye.conf都是skyeye的硬件配置文件。memmap.conf 適用于skyeye0.2以下版本,而skyeye.conf 用于skyeye0.2以上版本。
c. 運(yùn)行帶網(wǎng)絡(luò)選項(xiàng)的硬件配置時(shí),注意用戶(hù)必須為root用戶(hù),而且當(dāng)前的可執(zhí)行路徑中可以搜索到ifconfig命令
d. 運(yùn)行帶網(wǎng)絡(luò)選項(xiàng)的硬件配置時(shí),需要編譯安裝內(nèi)核模塊tuo.o (在RedHat系統(tǒng)中,該模塊在/lib/modules/2.4.x/kernel/drivers/net/tun.o)
e. 請(qǐng)閱讀skyeye.conf.txt來(lái)獲得skyeye.conf的配置選項(xiàng)的含義
f. 可參考skyeye-binary-testutils-x.x.x.tar.bz2軟件包(x.x.x代表其的版本號(hào))中已經(jīng)設(shè)定好的skyeye.conf來(lái)配置特定的硬件模擬環(huán)境,并可嘗試用SkyEye運(yùn)行這個(gè)軟件包中編譯好的操作系統(tǒng)內(nèi)核。
下面是一些skyeye.conf的例子:
FOR AT91 (0) special for ucosii
-------------------------------------------
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
FOR AT91 (1) special for μClinux
-------------------------------------------
#skyeye config file sample
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
#set nic info state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:5:3:2:1:f, ethmod=tuntap, hostip=192.168.2.1
FOR ep7312 (1) special for linux
-------------------------------------------
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00200000
mem_bank: map=M, type=RW, addr=0xc0200000, size=0x00200000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc0400000, size=0x00c00000
FOR StrongArm SA1100 (1) speciall for linux
-------------------------------------------
cpu: sa1100
mach: sa1100
mem_bank: map=I, type=RW, addr=0x80000000, size=0x40000000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00400000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc0c00000, size=0x01400000
mem_bank: map=I, type=RW, addr=0xe0000000, size=0x08000000
#0xe0000000 128M cache flush memory bank
|

 |

|
三.小結(jié)
本文講解了SkyEye硬件模擬平臺(tái)的硬件配置選項(xiàng),以及如何安裝使用SkyEye。如果讀者能夠熟練掌握SkyEye的使用,則會(huì)提高開(kāi)發(fā)、調(diào)試操作系統(tǒng)等的進(jìn)度,特別是對(duì)操作系統(tǒng)、驅(qū)動(dòng)程序如何與嵌入式硬件系統(tǒng)進(jìn)行交互有更深刻的了解。
參考資料
關(guān)于作者