在虚拟机上运行vxWorks
Vxworks是一個嵌入式系統,主要運行在arm、ppc、mips等嵌入式處理器上,它同樣可以運行在X86處理器上。風河公司開發的tornado開發環境就
包括了pentium版本,并且發布了相應的bsp。因此我們可在vmware虛擬機上運行vxworks,利用虛擬機的功能,我們不需要額外的計算機硬件就可
以開始我們的實驗。
?
系統引導
計算機系統上電后,首先需要執行引導程序,然后加載操作系統。嵌入式系統中一般是將引導程序(稱之為bootrom)固化在ROM芯片(也稱為
bootrom,指的是物理硬件)中。系統上電后執行ROM中的引導程序,將操作系統由flash(或硬盤)加載到內存。對于PC而言,系統上電后運行BIOS
程序,之后將軟盤或則硬盤上的引導扇區載入內存執行引導過程,引導程序再將操作系統加載到內存中啟動。vmware的虛擬硬盤開始時沒有安裝
引導程序,因此無法從硬盤引導。因此我們需要制作一個引導軟盤來引導系統加載vxworks。我們的第一個實驗就是編譯引導程序鏡像,制作引導
盤。
?
制作引導盤
首先要在你的PC上Tornado 2.2 for pcPentium開發環境。另外需要安裝pcPentium的BSP包,這個軟件包可以到風河公司的網站免費下載。
制作引導盤當然還需要一張軟盤,但是目前的PC基本都不使用軟盤軟驅了(如果你的古董機還有軟驅的話,那么恭喜你,你只需要一張軟盤就搞定了)。
好在vmware可以直接使用軟盤鏡像并且可以直接創建軟盤鏡像,因此我們在vmware中安裝一個虛擬的windowsxp系統,以便在虛擬的windowsXP系統中
將軟盤鏡像格式化,并制作啟動軟盤。當然也可以使用虛擬軟驅RamDiskNT在主機上使用軟盤鏡像。
Ok,準備工作做好了,我們開始編譯bootrom。你可以通過tornado集成開發環境的菜單命令build boot rom。
?
??彈出build boot rom對話框,我們選擇pcpentium BSP、編譯bootrom、工具使用gnu
?
?
?
編譯完成后可以在$WIND_BASE/target/config/pcPentium目錄下找到編譯出來的bootrom文件。
我們也可以使用命令行方式編譯bootrom,進入cmd命令行界面,進入
$WIND_BASE/target/config/pcPentium目錄,目錄中有一個Makefile文件,我們就是使用這個makefile文件來編譯bootrom。實際集成開發環境也是使用它
來編譯的。編譯之前我們需要設置一下所需的環境變量:
set WIND_BASE=D:/Tornado2.2
set WIND_HOST_TYPE=x86-win32
實際上tornado已經提供了一個批處理文件用于設置相關的環境變量,這個文件就是
$WIND_BASE/host/x86-win32/bin/torVars.bat,我們也可以直接運行這個批處理
../../../host/x86-win32/bin/torVars.bat
然后執行命令
make bootrom
就可以在$WIND_BASE/target/config/pcPentium目錄下生成bootrom文件
把上面的命令寫成一個批處理makeBootRom.bat,方便使用,內容如下:
D:/tornado2.2/host/x86-win32/bin/torVars.bat
cd %WIND_BASE%/target/ config/pcPentium
make bootrom
?
好了,編譯成功。下一步使用如下命令創建引導盤:
mkboot a: bootrom
mkboot.exe是tornado提供的制作啟動盤的工具,a盤是軟盤的盤符,bootrom就是我們的引導鏡像文件。
?
將制作好的引導盤載入虛擬機中:
?
?
?
?
?
?
?
虛擬機上電后自動從軟盤啟動,出現如下界面。
?
?
是的,你沒看錯,系統確實已經成功啟動,只不過vxworks系統默認是不接受任何輸入輸出的。因此我們看不到它運行的任何東西,也無法操作它。
這樣一個界面讓人很無語,這跟一個人變成了瞎子瘸子沒什么分別。下一步,我們將console組件加入到bootrom中。
打開$WIND_BASE/target/config/pcPentium/config.h文件,找到
#undef INCLUDE_PC_CONSOLE??????????????? /* PC keyboard and VGA console */
將它改為:
#define INCLUDE_PC_CONSOLE??????????????? /* PC keyboard and VGA console */
那么結合上下文:
#ifdef INCLUDE_PC_CONSOLE
#?? define PC_CONSOLE?????? ????(0)????? /* console number */
#?? define N_VIRTUAL_CONSOLES?? (2)????? /* shell / application */
#endif /* INCLUDE_PC_CONSOLE */
很明了,定義這個宏之后console就打開了。重新編譯bootrom并制作啟動軟盤。在虛擬機中運行,會看到如下界面:
?
?
輸入p命令,查看系統的啟動參數,其意義如下:
boot device:fd=0,0 ——啟動設備為軟驅,0,0表示第一個軟驅,3.5寸盤
unit number:0 ——設備單元號,一般為0
processor:0 ——處理器編號,一般為0
host name:host ——主機名,訪問主機時用到,比如從主機復制文件:cp “host:src”, “./dest”
file name:/fd0/vxWorks.st ——vxworks鏡像文件(包括了完整的路徑)
inet on Ethernet (e):90.0.0.50 ——本地網卡ip地址
host inet(h):90.0.0.3 ——主機ip地址
user (u):target ——用戶名,用來訪問ftp服務器,一般都是主機
flags (f):0 ——標識,十六進制數,它的意義下面再講
?
?
?
?
BOOT_LINE
?
?
bootrom支持從本地磁盤上加載vxworks系統鏡像文件,也支持從網絡加載vxworks系統鏡像文件。在系統開發階段需要頻繁的編譯
和加載系統鏡像,通常我們使用網絡加載的方式,這樣在主機上修改完代碼,編譯之后就可以通過網絡加載到目標機上運行。而
在系統開發后期,或者系統發布正式運行時,則設置為從本地磁盤加載,此時我們可以將系統鏡像文件發在本地磁盤上,開機即
可自動加載運行。從上面的參數可以看出,系統默認從軟驅加載。可以通過c命令修改這些參數,具體的修改步驟就不說了。也可
以通過配置文件中的默認bootline來修改這些默認的參數。
打開$WIND_BASE/target/config/pcPentium/config.h文件,找到cpu==pcPentium選項下:
#define DEFAULT_BOOT_LINE /
???????? "fd=0,0(0,0)host:/fd0/vxWorks.st h=90.0.0.3 e=90.0.0.50 u=target"
這就是默認的bootline,bootline的格式如下:
bootDev(unitNum,procNum) hostname:bootFile e=ead b=bad h=had g=gad u=username pw=password f=flags tn=targetName s=startupScript o=other
具體含義:
bootDev / 設備名,軟盤:fd; 硬盤:ATA;網絡要根據網卡的類型來做:NE2000及其兼容網卡為ENE,3COM以太網卡為ELT,Intel網
卡為EEX,Intel82559網卡為fei ,3C905B PCI網卡為elPci。
unitNum / 設備單元號,一般指為0
procnum / cpu的處理器號,一般為0
flags / 標識,十六進制數,意義如下:
0x01: 關閉對處理器0的系統控制
0x02: 將局部symbols和全局symbols裝入目標機symbols表
0x04: 禁止自動啟動(即由用戶輸入boot line)
0x08: 快速boot(不計數等待用戶輸入)
0x40: 使用BOOTP or DHCP client
0x80: 使用TFTP獲取image,否則使用RSH或FTP,用FTP時pw不為空
0x100: 使目標機登記為一個代理ARP client
ead / 目標機ip地址,此值如為空,網絡接口不被幫定
bad / 背板接口
had / 主機ip地址
gad / 網關地址,如果主機和目標機不在一個局網里,需要
bootFile: / 存放vxworks image的路徑
usr: / 使用FTP或RSH時的用戶名
passwd: / ftp password
other: / 從網絡啟動時此值可為空,當從軟盤或硬盤啟動時,如果此值為你的網絡設備,boot會為你綁定網絡設備
hostname: / 主機名,任意
targetName:/目標機名
startupScript: / 腳本名,在boot以后的target shell里執行
?
因為我們要做很多實驗,還是把它配置成網絡加載方便一點。修改為:
#define DEFAULT_BOOT_LINE /
???????? "lnPci (0,0)host:d://ftp//vxWorks h=192.168.1.1 e=192.168.1.2 u=target"
這里詳細講解一下設備名稱,對于不同的設備,其命名格式不同,對于塊設備的命名規則我們可以在bootconfig.c
文件的bootLoad函數中找到對應的格式化字符串,比如軟驅的格式是fd=x,x,可以找到如下語句:
???????? ??? sscanf (params.bootDev, "%*2s%*c%d%*c%d", &drive, &type);
其中"%*2s%*c%d%*c%d"就是對應的格式,星號表示此數據忽略。再例如ATA硬盤其格式字符創為"%*3s%*c%d%*c%d";
對于網卡,則需要使用驅動程序中定義的名稱,vxworks一般使用END驅動(Enhanced Network Driver),在驅動程序
提供的xxxEndLoad函數會返回一個設備名。比如AMD的PCNET-PCI網卡,驅動程序文件為ln97xEnd.c,其中ln97xEndLoad
函數中會返回LN_97X_DEV_NAME
??? if (initString [0] == NULL)
??????? {
??????? bcopy ((char *)LN_97X_DEV_NAME, initString, LN_97X_DEV_NAME_LEN);
???????? DRV_LOG (DRV_DEBUG_LOAD, "Returning string.../n", 1, 2, 3, 4, 5, 6);
??????? return ((END_OBJ *)OK);
??????? }
LN_97X_DEV_NAME的定義在頭文件ln97xEnd.h中:
#define LN_97X_DEV_NAME ???????? "lnPci"????? /* name of the device */
??
修改網卡驅動程序
?
Vmware自帶的虛擬網卡是AMD的PCnet-PCI, vxworks自帶的驅動程序(頭文件為target/h/drv/end/ln97xEnd.h)據測試在vmware中無法工作。
大家可以試一下,在config.h文件中定義INCLUDE_LN_97X_END編譯宏,執行make bootrom命令生成一個bootrom進行測試,你將得到下面的
錯誤提示:
?
因此需要從AMD官方網站下載最新驅動。解壓后得到一個tar目錄,將這個目錄覆蓋$WIND_BASE/tar目錄,然后運行
$(WIND_BASE)/host/x86-win32/bin/ torVars.bat
進入$(WIND_BASE)/target/src/drv/end目錄,運行:
make CPU=PENTIUM tool=gnu ln97xend.o
重新定位到$(WIND_BASE)/target/lib/pentium/PENTIUM/common目錄,并將上一步生成的文件ln97xend.o復制到此目錄下。
備份此目錄下的文件libdrv.a;運行命令
arpentium -d libdrv.a ln97xEnd.o,刪除libdrv.a中原有的ln97xEnd模塊,然后再運行命令:
arpentium -ra iOlicomEnd.o libdrv.a ln97xEnd.o
將我們剛剛創建的新模塊添加進去。這里的-r選項是表示替換,-a選項表示文件放在指定文件(iOlicomEnd.o)之后。
?
然后我們需要修改配置文件,使bootrom中包含我們的網卡驅動程序,確保
#define?INCLUDE_END?/*?Enhanced?Network?Driver?Support?*/
#define?INCLUDE_LN_97X_END?/*?(END)?AMD?79C97x?PCI?interface?*/
而其它的網卡驅動宏都是#undef的。
?
修改sysLn97xEnd.c
打開C:/tornado2.2/target/config/pcPentium目錄下的sysLn97xEnd.c文件,先定位到 “memory-mapped IO
base”這段文字,然后將其前面的參數由pciRsrc[endUnit].bar[1]修改為NONE,保存即可,
pciRsrc[endUnit].bar[1],???? /* memory-mapped IO base */
NONE, /* memory-mapped IO base */
編譯bootrom并制作引導盤啟動虛擬機,可以看到錯誤沒了,如下圖:
?
?
編譯vxWorks
?
為了測試一下網卡驅動功能正常,我們可以編譯一個vxworks鏡像文件,然后通過ftp加載到虛擬機中運行。
編譯vxworks文件很簡單,只需要在target/config/pcPentium目錄下執行命令
make vxWorks
將生成一個vxWorks文件,把這個文件放到ftp目錄下。并且打開ftp服務器(這里使用tornado自帶的wftpd32.exe),
添加一個新用戶user=target, password=target。使用引導盤啟動虛擬機。引導程序將自動加載這個鏡像并運行:
可以看到,Attaching network interface lo0… done。并且vxworks已經正常運行。
?
加入SHELL組件
??
上面看到的這個界面與我們平時在實驗室看到的不一樣:沒有大大的vxworks的logo。原因是vxworks默認不包含shell組件,需要修改config.h文件:
#define INCLUDE_SHELL
重新執行makevxwoks命令,生成文件加載到虛擬機中,就會出現如下界面,不過此時的shell還不能識別命令,因為制作的鏡像中沒有符號表,
因此無法解析命令。這樣的shell簡直就是廢材。
?
?
?使用符號表文件
?
要shell識別命令,需要提供符號表文件。上面的makefile vxWorks命令在生成vxWorks文件的同時還生成了一個符號表文件vxWorks.sym,這個文件
可用于主機上的WDB進行調試。首先要配置目標機,在tornado中選擇tools/target serves/config菜單命令:
?
彈出如下對話框,可以新建一個目標機配置,在Core File and Symbols選項中指定vxWorks.sym文件,另外需要指定后臺(目標機為后臺,主機為前臺)通信方式為wdbrpc并設置IP地址:?
?
?????????????????????
?
?
?
設置完成,單擊OK。或者直接單擊Launch啟動,此時在windows的任務欄會出現target-server的小圖標,雙擊它可以查看詳細信息:
?
?
?
?
?
?
連接成功后,在主界面上的下拉列表中選擇配置的target-server,并單擊->i圖標啟動shell,這時候就可以執行輸入的命令了。如下圖:
?
?
?
?
雖然使用tornado集成環境進行調試有直觀的優勢,并且支持源碼級調試,一切看起來都很美。但是,目標機與主機之間的通信通常比較耗時,有時候由于
種種原因還可能出現目標機連接不上的問題。在實際使用時,用得比較多的還是直接在目標機的控制臺中輸入命令進行調試。這要求把符號表和代碼一起
下載到目標機上,這里又有兩種方式:一種是符號表文件放在主機上,系統啟動時從主機同步符號表;另一種是直接將符號表編譯到vxWorks鏡像文件中。
?
?
從主機同步符號表
?
這種方式需要修改配置文件,在config.h中添加
#define INCLUDE_SYM_TBL_SYNC
當然最好還是加上那些show函數,否則只能打斷點卻不能查看任務狀態等重要信息,就像瞎子走路,只能邁動兩腿,卻不知身在何方,是很郁悶的。添加如下選項:
#define INCLUDE_SHOW_ROUTINES
編譯之后,將vxWorks文件和vxWorks.sym文件都放到ftp目錄下。啟動虛擬機,我們看到它自動將符號表同步了。然后我們就可以直接在控制臺輸入命令進行操作。
?
?
?
?
編譯vxWorks.st
?
?
最為直接的一種方式就是將符號表編譯到vxWork文件中,這樣不需要連接主機就可以在控制臺上進行操作了。編譯方式也很簡單:
make vxWorks.st
這樣就搞定了。雖然直接將符號表嵌入到vxWorks文件中,鏡像文件的體積會增大,但是現在的硬件這么便宜。有的嵌入式系統甚至配置了2G內存。
因此這個問題越來越容易解決了。
總結
以上是生活随笔為你收集整理的在虚拟机上运行vxWorks的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喝茶能够刮油减肥?其实是错觉
- 下一篇: android setimagereso