在虚拟机上运行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相关推荐
- 手把手教学——记录在Winxp虚拟机上安装Vxworks操作系统及其编译器Tornado的详细过程(1——WinXP操作系统)
(Tornado2.2/Vxworks5.5.1 for Pentium)引言 本文实现了在Windows XP系统(基于虚拟机)上安装Tornado2.2,并且通过在虚拟机上安装虚拟机的方式安装Vx ...
- 路由器逆向分析------在QEMU MIPS虚拟机上运行MIPS程序(ssh方式)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69652258 在QEMU MIPS虚拟机上运行MIPS程序--SSH方式 有关在u ...
- 【容器技术】在裸机与虚拟机上运行容器:性能和优点
根据最近的研究,Docker正在像野火一样蔓延,特别是在企业中,它的采用率从2015年的13%上升到了65%以上;另有35%的公司计划使用Docker.根据这些报告,容器采用的主要驱动因素是需要提高研 ...
- 在Mac虚拟机上运行Flutter项目之山路十八弯
前言 最近刚上手Flutter,写了个小Demo,想着在ios上来一发,但作为一名Android Developer,我没有Mac(还不是因为穷),这可咋整? 幸好有万能的网友,带领我走进黑苹果的世界 ...
- 在虚拟机上跑vxworks的总结
我的虚拟机环境:VMware® Workstation,7.1.4 build-385536 Tornado2.2.1,即vxworks5.5.1版本 其中文章中用到的文件下载处:http://dow ...
- Android虚拟机运行不了程序,Android程序在Android9.0手机或者虚拟机上运行不了的解决方法...
1.在虚拟机上我使用的是Android5.0版本,当前manifests的application标签配置如下,正确运行没问题. android:allowBackup="true" ...
- 梦幻西游网页版无法在虚拟机上运行【游戏】【页游】【虚拟机】
辛辛苦苦在macbook上安装了parallel win8 辛辛苦苦在win8上装了梦幻西游网页版 最后居然给我跳出个 虚拟机上不能运行 简直了.百度到的有关问题的解决方案有时针对vm软件的解决方法. ...
- 安卓开发问题一:在虚拟机上运行APP不能运行,即闪退现象
在运行程序时,出现了虚拟机上打开自己写的APP,提示不能运行,也就是闪退的现象. 找了好多论坛,基本上是模拟器与API版本不同导致的,我的后来换了一个AVD设备,莫名其妙的就自己好了 现将解决方法整理 ...
- 在VMWare虚拟机上运行Twincat3
1 首先 ,在64位的操作系统当中运行TC3 PLC,必须要在BIOS当中使能VT-x,因为TC3说明书中明确提到 64 位系统要运行 TC3,VT-X 是必须要支持的. 2 必须在[控制面板]-[程 ...
最新文章
- 自定义服务器怎么调98k,《刺激战场》如何开自定义房间?升级可领房卡,3倍物资98k随便捡...
- Java --循环截取字符串
- android 京东白条支付,京东网银钱包安卓版上线:整合京东白条和小金库
- node-sass 安装失败 win32-x64-57_binding.node
- [Java] 蓝桥杯ADV-178 算法提高 简单加法
- EHIGH恒高:大话UWB技术之蓝牙定位的烦恼
- 华硕主板固态硬盘不识别_主板启动设置无法识别固态硬盘 - 卡饭网
- 工具-python实现电影字幕的自动翻译
- html制作手机预览效果,webstorm实现手机预览页面
- 企业财务制度二--会计科目名称和编号(一)1291 分期收款发出商品(转载)
- android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)
- 音频剪切matlab,科学网—matlab的音频处理:读取,裁剪,输出和命名 - 张智昊的博文...
- 射频中的 IM3、IIP3、OIP3、G、P1dB指标之间的关系
- html5 sandbox,”基情“无限的IE10和HTML5
- 2022KDD预讲 | 11位一作学者带你提前解锁优秀论文
- SQL语句(三) 更新语句(增 删 改)
- 场景应用:Redis使用setnx命令实现分布式锁
- java 后台打开新页面_Java后台打开浏览器窗口
- 推荐 -- 《分布式系统的工程化开发方法》
- 详谈C++11新特性之future及开源项目ananas(folly,std c++11和ananas的future各自的区别是?)