VMware虚拟机搭建VxWorks 6.9开发环境全攻略
1. 项目缘起:为什么要在VMware里跑VxWorks?
如果你接触过嵌入式开发,尤其是工业控制、航空航天、网络设备这些领域,大概率听说过VxWorks的大名。作为一款老牌、强悍的实时操作系统,它和Windows、Linux这类通用操作系统走的完全是两条路。VxWorks追求的是极致的确定性:你的任务必须在确定的时间内,得到确定的响应。这种特性,让它成为了对可靠性要求极高的关键任务系统的首选。
但问题来了,VxWorks通常运行在特定的目标硬件上,比如一块定制的工控板、一个网络处理器,或者一台航空电子设备。对于开发者来说,每次调试都要烧写到硬件,效率太低,成本也高。这时候,虚拟化技术就成了救星。在VMware这样的虚拟机里运行VxWorks,相当于在PC上凭空“造”出了一块标准的、可重复利用的“开发板”。编译、下载、调试、重启,整个流程都在软件层面完成,速度快,环境干净,还不用担心物理硬件损坏。
我最近因为一个遗留项目的维护,需要重新搭建VxWorks 6.9的开发环境。手头没有现成的物理板卡,用VMware虚拟机就成了最经济、最便捷的选择。整个过程下来,虽然官方文档有些年头了,但核心步骤依然有效,只是中间有几个“坑”需要特别注意。这篇文章,我就把在VMware Workstation 17 Pro上成功运行VxWorks 6.9的完整过程,以及我踩过的那些坑和解决方案,详细记录下来。
2. 环境准备:选对“原料”是成功的一半
在开始安装之前,准备工作至关重要。VxWorks 6.9是一个比较经典的版本,对宿主环境和工具链有特定要求,不能随便拿个最新版的VMware和Windows就来搞。
2.1 软件工具清单与版本考量
首先,你需要备齐以下软件,我强烈建议使用与我相同的版本,可以最大程度避免兼容性问题:
- 宿主操作系统:我使用的是Windows 10 专业版 64位。Windows 11理论上也可以,但考虑到VxWorks 6.9年代较早,在Win10上经过的测试更充分,稳定性更有保障。确保系统已安装所有更新,并关闭杀毒软件的实时防护(至少在安装过程中),以免误拦截。
- 虚拟机软件:VMware Workstation 17 Pro。这是当前主流且稳定的版本。不建议使用VMware Player,因为它缺少一些高级网络配置功能。VMware 16也可以,但17对现代CPU的虚拟化支持更好。至于网上流传的“许可证密钥”,请务必从VMware官网获取合法试用或购买正版,使用非授权版本可能在关键步骤出现无法预料的问题。
- VxWorks 6.9 安装包:你需要拥有合法的VxWorks 6.9安装介质(通常是ISO镜像或安装文件)。这个版本包含了Wind River Workbench开发环境和VxWorks源代码。请通过正规渠道从风河公司获取。
- BSP(板级支持包):这是关键中的关键。VxWorks需要针对特定硬件(在这里是虚拟硬件)的BSP才能启动。对于VMware虚拟机,风河官方提供了一个名为
VMware的BSP。请确认你的VxWorks 6.9安装包中包含了这个BSP(路径通常类似于...\vxworks-6.9\target\config\vmware)。
注意:网络上可能流传着一些第三方修改的BSP或针对旧版VMware(如VMware ESX)的BSP,对于VMware Workstation,请优先使用风河官方提供的
vmwareBSP,这是最稳妥的选择。
2.2 创建“虚拟开发板”:VMware虚拟机配置详解
打开VMware Workstation,点击“创建新的虚拟机”。这里的选择会直接影响后续VxWorks的安装和运行。
- 典型与自定义:选择“自定义(高级)”,这样我们可以精细控制每一个参数。
- 硬件兼容性:选择“Workstation 17.x”。保持与虚拟机软件版本一致。
- 安装来源:选择“稍后安装操作系统”。这是一个非常容易出错的点。不要在这里选择任何ISO镜像,因为我们不是要安装Windows或Linux,VxWorks的安装方式完全不同。
- 客户机操作系统:选择“其他”,版本也选择“其他”。因为VxWorks不在VMware的预设列表里。
- 虚拟机名称与位置:取一个清晰的名字,如“VxWorks 6.9 Dev”。位置选择一个剩余空间大于20GB的磁盘分区。
- 处理器配置:核心数量建议1-2个即可。VxWorks 6.9对多核支持(SMP)需要特定配置,初期调试单核更简单。务必在“虚拟化引擎”中,勾选“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI”。这是硬件辅助虚拟化,必须开启,否则虚拟机性能极差甚至无法运行某些系统。
- 内存:分配512MB - 1GB足够。VxWorks内核本身非常精简,分配过多内存反而可能被BSP的初始化代码忽略或处理不当。
- 网络连接:这是另一个关键点。选择“使用桥接模式网络”。
- 为什么是桥接模式?桥接模式让虚拟机像一台真实的、与宿主机并列的机器一样接入局域网,拥有独立的IP地址。这对于后续通过网络(FTP、Telnet)向VxWorks传输文件、进行调试至关重要。NAT模式虽然简单,但端口映射和网络发现会更麻烦。
- 操作:在“自定义硬件”中,找到网络适配器,选择“桥接模式”,并勾选“复制物理网络连接状态”。
- I/O控制器类型:保持默认的“LSI Logic”即可。
- 磁盘:选择“创建新虚拟磁盘”。磁盘类型用“SCSI”。最大磁盘大小,建议设置8-10GB,并选择“将虚拟磁盘拆分成多个文件”。这个磁盘主要用于存放VxWorks的编译输出文件、项目文件等,并非系统盘。
- 磁盘文件:默认名称即可。
- 移除不必要的硬件:在自定义硬件列表里,找到“USB控制器”、“声卡”、“打印机”,直接点击“移除”按钮将它们删掉。VxWorks不需要这些设备,移除它们可以让虚拟机配置更干净。
创建完成后,先不要启动虚拟机。我们还需要对虚拟机设置进行几项关键调整。
3. 核心配置调优:让虚拟机“长得像”一块开发板
右键点击新建的虚拟机,选择“设置”,进入详细配置页面。
3.1 修改虚拟机硬件兼容性(隐藏选项)
虽然创建时选了Workstation 17.x,但为了最大兼容性,我们可以将其改为稍旧的格式。点击“选项”标签页,选择“高级”,在右侧找到“固件类型”。将其从“UEFI”改为“BIOS”。VxWorks 6.9的引导程序(bootrom)通常是为传统的BIOS引导方式设计的,使用UEFI可能会导致无法引导。
3.2 调整处理器虚拟化选项
点击“硬件”标签页,选择“处理器”。在右侧“虚拟化引擎”下,确保以下两项已勾选:
- 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI(应已勾选)
- 虚拟化 IOMMU (IO 内存管理单元)这个建议取消勾选。IOMMU是给像Linux KVM、Windows Hyper-V这类更底层的虚拟化用的,对于在VMware里跑一个客户机操作系统,通常不需要,开启有时反而会引起问题。
3.3 配置串行端口(控制台输出)
这是调试阶段最重要的通道。VxWorks在启动初期,网络还没起来的时候,所有的内核启动信息、调试输出都通过串口(Serial Port)打印。我们需要在VMware里模拟一个串口,并将其输出重定向到宿主机的文件或窗口。
- 在“硬件”标签页,点击“添加”按钮。
- 选择“串行端口”,点击“下一步”。
- 选择“输出到文件”。这是最方便的方式,所有串口输出会实时写入一个文本文件,方便你查看和搜索日志。
- 点击“浏览”,在宿主机上找一个位置,创建一个文件,例如
C:\VxWorksLog\com1.log。请确保路径存在且你有写入权限。 - 点击“完成”。此时硬件列表里会多出一个“串行端口”,设备状态为“已连接”。
- 关键一步:双击新添加的“串行端口”,或者选中后点击“高级”。确保“I/O模式”是“轮询”而不是“中断”。VxWorks的串口驱动在虚拟环境下,使用轮询模式通常更稳定可靠。
至此,你的“虚拟开发板”就配置好了。它拥有一个基于BIOS的x86平台、一个桥接网卡、一个输出到文件的串口,以及一个干净的SCSI硬盘。这个环境已经非常接近一块标准的x86开发板了。
4. 构建引导镜像(Bootrom)与内核(VxWorks)
现在,我们切换到Wind River Workbench环境来编译生成需要的镜像文件。Workbench是基于Eclipse的集成开发环境,是VxWorks 6.x系列的标准开发工具。
4.1 创建Bootrom项目
Bootrom相当于PC的BIOS,它的作用非常有限:初始化最基础的硬件(CPU、内存、串口、网卡),然后从网络(TFTP/FTP)或本地磁盘加载真正的VxWorks内核镜像。
- 启动Wind River Workbench。
- 选择
File -> New -> Wind River Workbench Project。 - 在“Project Name”中输入,例如
bootrom_vmware。 - 在“Project Type”中,选择
Boot Loader Components。 - 点击“Next”,在“BSP Selection”页面,这是最关键的一步。在列表中找到并选择
vmware。如果你找不到,说明你的VxWorks安装不完整或者BSP路径没有正确识别。请检查安装目录下的target\config文件夹。 - 继续“Next”,在“Boot Loader Configuration”中,选择
Boot ROM。Bootrom有两种类型:Boot ROM是压缩的,体积小;Boot ROM (uncompressed)是未压缩的,加载更快但体积大。我们选择标准的Boot ROM即可。 - 在“Boot Line”参数中,这是告诉Bootrom去哪里加载VxWorks内核。我们需要根据后续的网络配置来填写。一个典型的用于网络加载的bootline如下:
fei(0,0)host:vxWorks h=192.168.1.100 e=192.168.1.50 u=target pw=target tn=targetfei(0,0): 表示使用第一个网络适配器(fei是VxWorks对PCnet系列网卡的驱动名,VMware的默认虚拟网卡兼容此驱动)。host:vxWorks: 从主机(host)加载名为vxWorks的文件。h=192.168.1.100: 宿主机的IP地址(即你的Windows电脑在桥接网络下的IP)。e=192.168.1.50: 目标机(虚拟机)的IP地址。这个IP需要和宿主机在同一网段。u=target pw=target tn=target: FTP登录的用户名、密码和目标名。我们后续会在宿主机搭建一个FTP服务器,并使用这些凭证。- 你也可以先使用一个简单的本地加载配置(如
ata=0,0(0,0)host:vxWorks表示从第一个IDE硬盘加载),但网络加载是更主流的开发方式。
- 点击“Finish”完成项目创建。Workbench会自动生成一个默认的
bootConfig.c等配置文件。 - 右键点击项目,选择
Build Project。编译成功后,你会在项目的default文件夹下找到生成的文件,其中最重要的就是bootrom.bin(也可能是bootrom或bootrom.sys,具体看BSP设置)。这个文件就是我们的引导镜像。
4.2 创建VxWorks内核项目
VxWorks内核才是真正的操作系统,它包含了任务调度、内存管理、文件系统、网络协议栈等所有核心组件。
- 同样,
File -> New -> Wind River Workbench Project。 - 项目名,例如
vxworks_vmware。 - 项目类型选择
Operating System Kernel。 - 点击“Next”,同样选择
vmwareBSP。 - 点击“Finish”创建项目。这会创建一个包含默认内核配置(
prjParams.h)的项目。 - 在项目导航器中,找到并打开
kernel configuration工具(通常是一个叫“内核配置”的视图或右键菜单选项)。在这里,你可以像勾选菜单一样,添加或移除组件。- 必须包含的组件:
INCLUDE_NETWORK(网络支持)、INCLUDE_FTP_SERVER或INCLUDE_TFTP_CLIENT(取决于你用什么协议加载)、INCLUDE_SHELL(命令行外壳,用于调试)。 - 建议包含的组件:
INCLUDE_PCI_BUS(PCI总线支持)、INCLUDE_DEBUG(调试支持)、INCLUDE_WDB(Wind River Debugger 支持)。 - 对于初学,可以直接使用默认配置,它通常包含了最基本的功能。
- 必须包含的组件:
- 配置完成后,保存。然后右键点击项目,选择
Build Project。编译过程会比Bootrom长一些。编译成功后,在default文件夹下会生成vxWorks文件。这个就是可引导的内核镜像。
4.3 宿主机服务搭建:FTP与TFTP
为了让虚拟机里的Bootrom能通过网络加载vxWorks内核,我们需要在宿主机(Windows)上运行一个文件服务器。
方案一:使用FTP服务器(推荐)FTP更稳定,适合传输较大的文件。你可以使用任何轻量级FTP服务器软件,如FileZilla Server。
- 安装并启动FileZilla Server。
- 创建一个新用户,用户名和密码就设置为我们在bootline里写的
target。 - 为该用户设置一个主目录,例如
C:\tftproot。 - 将编译好的
vxWorks内核文件复制到这个目录下。 - 确保Windows防火墙允许FileZilla Server通过。
方案二:使用TFTP服务器TFTP协议更简单,常用于网络引导。Windows本身没有内置TFTP服务器,可以使用Tftpd64这类小工具。
- 运行Tftpd64,在“Current Directory”中设置服务器目录,例如
C:\tftproot。 - 将
vxWorks文件放入该目录。 - Bootline需要相应修改,使用
fei(0,0)host:vxWorks h=192.168.1.100这种更简单的格式(省略用户密码),并确保BSP配置中包含了TFTP客户端支持。
我个人更推荐FTP,因为它在传输完整性和稳定性上更好。准备好服务器后,务必将宿主机防火墙中对应端口(FTP的21,TFTP的69)打开,或者临时关闭防火墙进行测试。
5. 启动与调试:从黑屏到命令行
激动人心的时刻到了,我们要启动这台“虚拟开发板”。
- 转换Bootrom格式:VMware虚拟机不能直接引导
.bin文件。我们需要将bootrom.bin转换为VMware认可的引导磁盘镜像。使用一个名为mkisofs(或genisoimage)的工具,它通常在Cygwin或一些开源工具包里有。打开命令行,执行:
这条命令会生成一个mkisofs -o bootrom.iso -b bootrom.bin -no-emul-boot -boot-load-size 4 -boot-info-table .bootrom.iso文件。-b bootrom.bin指定了引导扇区文件。 - 配置虚拟机引导:回到VMware,打开虚拟机设置。在“硬件”标签页,选择“CD/DVD (SATA)”。在右侧,选择“使用ISO映像文件”,然后浏览并选中刚才生成的
bootrom.iso。同时,勾选“启动时连接”。 - 启动虚拟机:点击VMware的“开启此虚拟机”。虚拟机启动后,会首先从虚拟光驱(即我们的bootrom.iso)引导。
- 观察串口输出:虚拟机屏幕很可能是一片漆黑,或者显示一些BIOS信息后停住。不要慌,这才是正常现象。VxWorks的启动信息都输出到我们之前配置的串口了。立即用文本编辑器(如Notepad++)打开你设置的日志文件
C:\VxWorksLog\com1.log。你应该能看到类似下面的滚动信息:
如果看到了“Loading...”和进度条,并且最后显示“Starting at ...”,恭喜你,Bootrom已经成功通过网络从你的FTP服务器下载了Initializing... CPU: GenuineIntel Pentium Pro/II/III Memory Size: 0x20000000 (512MB) ... Attached TCP/IP interface to fei unit 0 IP: 192.168.1.50 Mask: 255.255.255.0 ... Boot device: fei Unit number: 0 Processor number: 0 File name: vxWorks Inet on ethernet (e): 192.168.1.50:ffffff00 host inet (h): 192.168.1.100 user (u): target ftp password (pw): target flags (f): 0x0 target name (tn): target Attaching to TCP/IP interface... Done. Loading... ################################################## 100% Starting at 0x00100000...vxWorks内核,并开始启动了! - 进入VxWorks Shell:内核启动后,串口日志会继续输出大量内核初始化信息。当看到类似
->或者value = 0 = 0x0这样的提示符时,说明VxWorks已经启动完成,并且Shell组件已激活。此时,你可以在串口终端(或者如果你配置了Telnet,也可以用Telnet连接虚拟机的IP192.168.1.50)中输入命令了。尝试输入i查看所有任务,或者help查看命令列表。
6. 常见问题与深度排错指南
即使按照步骤操作,你也可能会遇到一些问题。下面是我在搭建过程中遇到的和可能遇到的典型问题及其解决方法。
6.1 虚拟机启动后黑屏,串口日志无输出
- 可能原因1:串口配置错误。
- 检查:确认虚拟机设置中串口已“连接”,且输出文件路径正确、有写入权限。尝试将输出改为“输出到命名管道”(例如
\\.\pipe\com_1),然后用putty等终端软件选择“串行”,连接该管道名进行实时查看。 - 检查:串口的I/O模式是否设置为“轮询”。
- 检查:确认虚拟机设置中串口已“连接”,且输出文件路径正确、有写入权限。尝试将输出改为“输出到命名管道”(例如
- 可能原因2:Bootrom镜像制作有误或未正确引导。
- 检查:虚拟机设置中,CD/DVD是否连接了正确的
bootrom.iso文件,并且是“启动时连接”。可以尝试在虚拟机启动时按F2进入虚拟BIOS,查看引导顺序,确保CD-ROM在硬盘之前。 - 检查:
mkisofs命令是否执行成功,生成的ISO文件是否有效。可以尝试用虚拟机挂载一个Linux Live CD,如果能正常引导,说明虚拟机本身没问题,问题在ISO。
- 检查:虚拟机设置中,CD/DVD是否连接了正确的
- 可能原因3:硬件兼容性问题。
- 检查:虚拟机设置中的“固件类型”是否为“BIOS”。
- 检查:是否错误地移除了某些必要硬件?确保至少有处理器、内存、硬盘、CD/DVD、网络适配器和串口。
6.2 Bootrom卡在“Attaching to TCP/IP interface...”或加载失败
- 可能原因1:网络不通。
- 检查:宿主机和虚拟机的IP是否在同一网段?在宿主机上ping虚拟机的IP(
192.168.1.50)是否能通?注意:在Bootrom完全启动并加载内核前,虚拟机还没有IP,此时ping不通是正常的。但Bootrom自身会通过BOOTP/DHCP或静态配置获取IP,如果配置错误,会卡在这里。 - 检查:宿主机防火墙是否阻止了FTP/TFTP连接?最直接的测试方法是暂时完全关闭Windows防火墙。
- 检查:VMware网络适配器模式是否为“桥接模式”,并且桥接到了正确的物理网卡(如果你有有线/无线多个网卡)。
- 检查:宿主机和虚拟机的IP是否在同一网段?在宿主机上ping虚拟机的IP(
- 可能原因2:FTP/TFTP服务器问题。
- 检查:FTP服务器是否已启动?用户认证信息(
u,pw)是否正确?vxWorks文件是否已放入服务器的正确目录,并且文件名与bootline中的host:后面的名字完全一致(区分大小写)? - 检查:使用FTP客户端(如FileZilla Client)从本机
127.0.0.1连接你自己的FTP服务器,看能否成功登录并看到vxWorks文件。
- 检查:FTP服务器是否已启动?用户认证信息(
- 可能原因3:Bootline参数错误。
- 检查:bootline字符串的拼写和格式必须绝对正确,不能有多余空格或错误标点。特别是设备名
fei(0,0),括号是英文括号,逗号间没有空格。
- 检查:bootline字符串的拼写和格式必须绝对正确,不能有多余空格或错误标点。特别是设备名
6.3 内核启动后崩溃或重启
- 可能原因1:内核组件冲突或配置错误。
- 检查:在Workbench的内核配置中,是否添加了某些实验性或不稳定的组件?尝试创建一个最简内核(只包含
INCLUDE_SHELL和INCLUDE_NETWORK),看是否能稳定启动。 - 检查:
prjParams.h文件中是否有自定义的、错误的宏定义?与BSP默认的config.h文件是否有冲突?
- 检查:在Workbench的内核配置中,是否添加了某些实验性或不稳定的组件?尝试创建一个最简内核(只包含
- 可能原因2:内存配置问题。
- 检查:虚拟机分配的内存大小是否在BSP支持的范围内?
vmwareBSP通常能自动检测内存,但如果分配过大(如超过2GB),旧版BSP的初始化代码可能处理不了。尝试将虚拟机内存调整为512MB。
- 检查:虚拟机分配的内存大小是否在BSP支持的范围内?
- 可能原因3:编译器/工具链问题。
- 检查:Workbench项目是否使用了正确的编译器和编译选项?确保你编译的是
default构建规格(通常是SIMNTgnu或PENTIUM4gnu),并且没有修改过默认的编译和链接参数。
- 检查:Workbench项目是否使用了正确的编译器和编译选项?确保你编译的是
6.4 如何从硬盘引导,摆脱网络依赖?
每次开发都依赖网络加载内核确实麻烦。一旦系统稳定,我们可以将VxWorks安装到虚拟硬盘上,实现本地引导。
- 准备硬盘镜像:首先,需要让VxWorks能识别并格式化虚拟硬盘。这需要在内核中包含
INCLUDE_DISK、INCLUDE_DOSFS等组件,并编写一段启动脚本。 - 创建启动脚本:在VxWorks Shell中,你需要先配置网络(如果内核已包含网络),然后使用
usrFtp或tftp命令将vxWorks内核文件下载到内存,再使用diskFormat和dosFsVolFormat命令格式化虚拟硬盘的第一个分区(例如ata=0,0),最后使用copy命令将内存中的内核镜像写入硬盘。 - 修改Bootrom:创建一个新的Bootrom项目,将bootline改为从硬盘加载,例如
ata=0,0(0,0)host:/ata0/vxWorks。编译生成新的bootrom.iso。 - 切换引导:用新的ISO引导,Bootrom会直接从虚拟硬盘加载内核,无需网络。这个过程涉及更多VxWorks系统编程知识,是进阶操作。
在VMware里成功运行VxWorks 6.9,就像是搭建了一个完美的沙盒。它隔离了物理硬件的不稳定因素,提供了快照、克隆等强大功能,让系统调试和测试变得高效而安全。我花了大约两天时间才把整个环境完全调通,大部分时间都耗在了网络配置、BSP选项理解和启动参数调试上。最大的体会是:日志是你的第一盟友。无论是串口日志还是Wind River Debugger的日志,里面包含了几乎所有问题的线索。遇到问题别急着乱改,静下心来看日志,从最早出现的错误信息开始分析,往往能事半功倍。另一个建议是,在修改任何重要配置(如BSP文件、内核选项)前,给虚拟机拍个快照,这样你永远有一条安全的退路。