VirtualBox虚拟机中搭建VxWorks 5.5开发调试环境全攻略
1. 项目概述与核心思路最近在折腾一个老项目需要在一个特定的嵌入式实时操作系统环境下进行调试和验证。这个系统就是VxWorks一个在工业控制、航空航天等领域有着深厚积累的RTOS。手头没有现成的硬件板卡搭建一套物理开发环境又费时费力于是很自然地想到了用虚拟机来模拟。VirtualBox以其免费、开源和相对轻量的特性成为了我的首选。经过一番摸索成功在VirtualBox里跑起了VxWorks 5.5Tornado 2.2环境并且通过Telnet连上了系统的Shell运行了第一个测试程序。整个过程下来感觉VirtualBox下的运行效率甚至比VMware还要流畅一些当然也踩了不少坑尤其是网络配置和BSP编译环节。这篇文章我就把从环境准备、镜像编译、虚拟机配置到最终联调的全过程以及其中关键的技术细节和避坑心得完整地梳理一遍。2. 环境准备与工具链梳理在虚拟机里运行VxWorks本质上是在x86架构的虚拟硬件上引导并运行一个为特定“板卡”编译的VxWorks镜像。因此我们的工作可以拆解为三个核心部分准备VxWorks开发环境宿主主机、配置虚拟的“目标硬件”VirtualBox虚拟机、以及建立两者之间的通信桥梁网络和文件传输。2.1 宿主主机环境搭建我的宿主主机是Windows 7系统这是为了兼容较老的Tornado 2.2开发环境。你需要准备以下核心软件Wind River Tornado 2.2: 这是VxWorks 5.5版本的集成开发环境。确保将其安装在一个没有中文和空格的路径下例如C:\Tornado2.2\。安装完成后务必要运行其提供的torvars.bat批处理文件通常位于C:\Tornado2.2\host\x86-win32\bin\这个脚本会设置必要的环境变量如WIND_BASE、WIND_HOST_TYPE等后续的编译命令依赖这些变量。VirtualBox: 我使用的是6.1.x版本。版本选择上只要不是太新或太旧与宿主系统兼容即可。关键是要支持我们需要的网络模式。辅助工具:RamDiskNT: 这是一个在Windows下创建虚拟RAM磁盘的工具。我们用它来模拟一个物理软驱A:因为早期的VxWorks引导方式常常依赖于软盘。我使用的是RamDiskNT 1.5版本创建一个1.44MB的软盘镜像文件并分配盘符A:。TFTP服务器软件: 例如Tftpd32/64或SolarWinds TFTP Server。VxWorks目标系统在启动后需要通过TFTP协议从宿主主机下载最终的可运行内核镜像vxWorks。这是一个非常关键且容易出错的环节。终端软件: 如PuTTY或SecureCRT用于通过Telnet协议登录到运行起来的VxWorks系统Shell。注意Tornado 2.2是一个比较古老的软件在现代操作系统如Windows 10/11上直接安装可能会遇到兼容性问题。如果必须在Win10/11上运行建议尝试使用兼容模式如Windows XP SP3或者更稳妥的方案是在Win7虚拟机中安装Tornado。我选择Win7宿主就是为了减少不必要的麻烦。2.2 BSP选择与理解BSPBoard Support Package是连接VxWorks操作系统和特定硬件板卡的桥梁。它包含了该板卡的启动代码、驱动程序、内存映射、中断配置等。VirtualBox虚拟的是一台标准的PCi386/PC-AT兼容机因此我们需要选择一个对应的PC架构BSP。在Tornado 2.2的target\config\目录下有多个PC类BSP例如pc486、pcPentium等。我选择了pcPentium因为它针对Pentium及以上处理器进行了优化功能相对完整也更适合我们虚拟的“现代”PC环境。后续所有的配置和编译都将基于这个BSP目录进行。3. 编译引导镜像与内核镜像这是整个流程中最核心的技术环节直接决定了虚拟机能否正确启动并加载系统。3.1 解读与修改BSP配置文件BSP的行为主要由config.h文件控制。我们需要重点关注几个部分并针对虚拟机环境进行修改。原始配置文件非常长包含了大量历史兼容性定义我们只需关注关键项。1. 引导参数Boot Line: 这是VxWorks启动时读取的“命令行参数”告诉内核从哪里获取IP地址、从哪里加载最终镜像等。在config.h中搜索DEFAULT_BOOT_LINE。对于pcPentiumBSP通常能找到类似下面的定义#define DEFAULT_BOOT_LINE \ lnPci(0,0)host:d:\\vxWorks h192.168.102.1 e192.168.102.88 utarget pwtarget tntarget我们需要根据自己规划的网络环境来修改它lnPci(0,0): 这指定了使用哪种网络驱动和单元号。lnPci对应AMD PCnet-PCI II驱动ln97xEnd这是VirtualBox默认模拟的网卡型号(0,0)表示第0个PCI总线的第0个设备。通常不需要修改。host:d:\\vxWorks: 这是TFTP下载路径。host是TFTP服务器的默认主机名d:\\vxWorks是服务器上镜像文件的路径。这个路径必须与你后续在TFTP服务器中设置的根目录以及存放的vxWorks镜像文件名完全匹配。例如如果你的TFTP根目录是C:\tftpboot那么这里应该写成host:C:\\tftpboot\\vxWorks。注意路径中使用双反斜杠。h192.168.102.1: 这是TFTP服务器的IP地址即你的宿主主机在虚拟网络中的IP。e192.168.102.88: 这是目标系统VxWorks启动后要使用的IP地址。utarget,pwtarget,tntarget: 分别是FTP/TFTP登录的用户名、密码和目标名。在简单的TFTP引导中这些字段可能不被使用但最好保持一致。2. 网络驱动配置: 确保正确的ENDEnhanced Network Driver驱动被启用。在config.h中找到网络驱动配置部分。我们需要启用INCLUDE_LN_97X_END因为它对应VirtualBox的默认网卡。#define INCLUDE_END /* Enhanced Network Driver Support */ #undef INCLUDE_LN_97X_END /* (END) AMD 79C97x PCI interface */将#undef INCLUDE_LN_97X_END改为#define INCLUDE_LN_97X_END。同时可以注释掉#undef其他不用的网卡驱动如INCLUDE_FEI_ENDIntel网卡等以减小镜像体积。3. 其他可选组件: 根据你的需要可以启用或禁用一些组件。例如为了获得Shell交互能力INCLUDE_WDB_SYS系统级任务调试和INCLUDE_SHELL是必须的它们通常在configAll.h或工程配置中已默认包含。如果你需要通过串口调试还需要配置INCLUDE_TTY_DEV和对应的串口驱动。3.2 生成引导镜像BootromBootrom是一个非常小的、固化在ROM或软盘中的程序它的核心任务就是初始化最基础的硬件如CPU、内存、网卡然后通过TFTP网络下载完整的vxWorks镜像到内存并跳转执行。进入BSP目录: 打开命令提示符CMD务必先运行C:\Tornado2.2\host\x86-win32\bin\torvars.bat来设置环境变量。然后切换到BSP目录cd C:\Tornado2.2\target\config\pcPentium执行编译命令:make bootrom_uncmpbootrom_uncmp: 生成未压缩的Bootrom镜像。压缩版bootrom体积更小但需要解压过程。未压缩版引导更快对于调试更友好。这个命令会调用makefile根据config.h等配置编译生成bootrom_uncmp或bootrom文件位于C:\Tornado2.2\target\config\pcPentium目录下是一个无扩展名的二进制文件。写入“软盘”: 我们需要把bootrom文件写入到之前用RamDiskNT创建的虚拟软驱A:中。Tornado提供了一个工具mkboot.exe。可以写一个简单的批处理文件makeboot.bat来一键完成echo off c: cd C:\Tornado2.2\host\x86-win32\bin call torvars.bat cd C:\Tornado2.2\target\config\pcPentium mkboot a: bootrom_uncmp pause运行这个批处理它会自动设置环境并执行mkboot a: bootrom_uncmp将引导镜像写入A盘。mkboot工具会在软盘上创建特定的文件系统结构并写入引导扇区。3.3 创建工程与编译内核镜像vxWorksBootrom只负责引导真正的操作系统是vxWorks镜像。我们需要在Tornado IDE里创建一个可下载的工程。创建Downloadable工程: 打开Tornado点击File - New Project。选择Create a bootable VxWorks image类型选择Downloadable project。在BSP选择页面浏览并选中pcPentiumBSP。配置工程参数: 给工程命名如VBoxVxWorks选择保存位置。在接下来的工程配置对话框中你可以通过勾选组件来定制内核。对于基础运行和网络测试确保以下组件被包含INCLUDE_SHELL(VxWorks Shell)INCLUDE_WDB(Wind Debugger)INCLUDE_NETWORK(网络支持)INCLUDE_LN_97X_END(AMD PCnet驱动)INCLUDE_PING(Ping工具用于测试网络) 你可以在Project - Properties - C/C Compiler的Extra Flags里或直接修改工程目录下的prjParams.h文件来微调配置但通常IDE的图形化配置已足够。编译内核: 在Tornado中选中你的工程点击Build按钮。编译成功后会在工程目录的default或yourProfileName子目录下生成vxWorks文件例如C:\Tornado2.2\target\proj\VBoxVxWorks\default\vxWorks。放置内核镜像: 将编译好的vxWorks文件复制到TFTP服务器的根目录下例如C:\tftpboot\并确保文件名与DEFAULT_BOOT_LINE中指定的路径完全一致。4. VirtualBox虚拟机配置详解虚拟机的配置需要尽可能模拟一台适合VxWorks运行的“纯净”PC。4.1 新建虚拟机类型与版本: 新建虚拟机类型选择“Other”版本选择“Other/Unknown”。内存: 分配至少64MB内存128MB或256MB更佳。VxWorks 5.5本身不需要太多内存但多留一些空间给应用和缓存更稳妥。硬盘:不需要创建虚拟硬盘。VxWorks将通过网络加载到内存中运行是一种无盘Diskless工作方式。跳过硬盘创建步骤。系统设置:主板: 取消勾选“启用EFI”。处理器: 1个CPU核心足够。务必开启PAE/NX支持在“系统-处理器”标签页某些内存配置需要它。显示: 显存可以调小如12MB。显卡控制器保持“VBoxSVGA”即可VxWorks通常不依赖高级图形功能。存储: 删除默认的控制器和空光盘。添加一个软盘控制器类型选择“I82078”。然后为这个控制器“添加软盘驱动器”选择“使用主机驱动器A:”。这样虚拟机就能访问我们之前用RamDiskNT创建的虚拟软驱了。4.2 网络配置——最关键的一步网络配置是连通宿主与虚拟机的生命线也是最容易出错的地方。网卡1Host-Only Adapter (引导与TFTP):连接方式选择“仅主机(Host-Only)网络”。界面名称选择VirtualBox创建的虚拟网卡例如“VirtualBox Host-Only Ethernet Adapter”。高级设置中混杂模式选择“全部允许”。这对于TFTP通信和后续的Telnet/WDB调试非常重要。芯片类型选择“PCnet-PCI II (Am79C970A)”。这是VxWorks的ln97xEnd驱动直接支持的型号兼容性最好。网卡2NAT Adapter (可选用于访问外网):如果需要VxWorks目标机访问互联网例如进行NTP同步或额外的网络测试可以添加第二块网卡连接方式为“网络地址转换(NAT)”。注意VxWorks启动时默认使用第一块网卡lnPci(0,0)进行引导和通信。第二块网卡需要你在VxWorks启动后手动配置IP和路由。宿主主机网络配置:打开Windows的网络连接找到“VirtualBox Host-Only Ethernet Adapter”。右键属性选择“Internet协议版本4(TCP/IPv4)”点击属性。手动设置IP地址需要与DEFAULT_BOOT_LINE中的h参数一致。例如IP地址:192.168.102.1子网掩码:255.255.255.0默认网关: 留空或填192.168.102.1确定保存。4.3 配置TFTP服务器安装并运行Tftpd32/64。在Current Directory中设置为你存放vxWorks镜像的目录例如C:\tftpboot。确保Server interface下拉框选中了宿主主机在Host-Only网络中的IP地址即192.168.102.1。保持TFTP服务器运行。5. 启动、连接与测试所有准备工作就绪现在可以启动虚拟机了。启动虚拟机: 在VirtualBox中启动虚拟机。由于我们设置了从主机软驱A:启动虚拟机会读取RamDiskNT中的Bootrom。观察引导过程: 虚拟机启动后你会看到Bootrom的初始化信息在屏幕上滚动。它会检测网卡、尝试DHCP可能失败然后最终使用DEFAULT_BOOT_LINE中的参数。关键日志行类似Attached TCP/IP interface to lnPci unit 0. IP: 192.168.102.88 Mask: 255.255.255.0 ... Loading... 192.168.102.1:C:\tftpboot\vxWorks如果看到“Loading...”并显示你的TFTP服务器IP和路径并且进度条开始增长说明网络引导成功正在下载vxWorks镜像。下载完成后系统会自动跳转执行。连接VxWorks Shell: 当vxWorks内核启动完毕通常会打印出类似“-”的Shell提示符如果配置了控制台输出。但更常用的方式是通过网络Telnet连接。打开PuTTY选择“Telnet”连接类型。主机名填写VxWorks目标机的IP即192.168.102.88端口保持默认的23。点击“Open”。如果一切正常你会看到VxWorks的启动Logo和Shell提示符-。运行测试程序: 在Telnet的Shell中你可以输入VxWorks命令。例如输入i可以查看当前系统中所有任务的状态。为了验证系统运行正常我们可以写一个最简单的C程序编译后下载运行。在Tornado中创建一个简单的“Hello from VirtualBox”的C代码文件编译成.out格式的可下载模块。在Tornado的Shell工具或Telnet中如果你配置了FTP服务器中使用ld()命令加载这个.out文件。加载后直接输入函数名或由ld返回的符号地址来执行。你将在控制台看到输出信息。6. 常见问题与深度排查指南在实际操作中几乎不可能一帆风顺。下面是我遇到的一些典型问题及解决方法。6.1 网络引导失败现象: Bootrom启动后长时间停留在“Trying to get IP via DHCP...”或直接提示“Loading...”失败、超时。排查步骤:检查IP配置: 确认宿主主机Host-Only网卡的IP是否与DEFAULT_BOOT_LINE中的h地址一致。确认子网掩码是255.255.255.0。检查TFTP服务器: 确认TFTP服务器的“Current Directory”设置正确并且vxWorks文件确实存在于该目录。确认TFTP服务器的服务端口默认69没有被防火墙阻止。可以临时关闭Windows防火墙测试。检查VirtualBox网络设置: 确认虚拟机网卡1是“仅主机网络”并且混杂模式是“全部允许”。尝试关闭虚拟机在VirtualBox全局设置 - 网络 - 仅主机网络中查看并确保虚拟网卡如VirtualBox Host-Only Ethernet Adapter的IPv4地址也在192.168.102.0/24网段例如192.168.102.100避免冲突。使用Wireshark抓包: 这是最强大的诊断工具。在宿主主机上对Host-Only虚拟网卡进行抓包。过滤bootp或tftp。观察是否有DHCP Discover/Offer/Request/Ack过程是否有TFTP Read Request包TFTP服务器是否有回复通过抓包可以清晰看到通信中断在哪个环节。检查Bootrom网卡驱动: 确保config.h中INCLUDE_LN_97X_END已正确定义并且没有其他冲突的网络驱动被启用。可以尝试在Bootrom编译时暂时去掉其他所有网络驱动宏定义。6.2 Telnet连接失败现象:vxWorks镜像似乎启动成功有内核启动日志但无法通过Telnet连接192.168.102.88:23。排查步骤:检查VxWorks网络配置: 首先确认vxWorks镜像编译时包含了INCLUDE_SHELL和网络栈。可以在Bootrom引导时传参或者确保内核默认配置正确。检查目标机IP: 在VirtualBox的串口控制台如果配置了或VGA输出中查看VxWorks启动后是否正确配置了IP地址。使用ifShow或inetAddrShow命令如果已有Shell查看网络接口状态。检查防火墙: 同样确保宿主主机的防火墙没有阻止对目标机IP的访问。Ping测试: 在宿主主机的命令提示符下ping目标机IP (ping 192.168.102.88)。如果不通说明网络层仍有问题回到网络引导环节排查。如果能ping通但Telnet不通可能是VxWorks的Telnet服务telnetd没有启动。确保编译时包含了INCLUDE_TELNET组件。使用WDB连接替代: Tornado的调试器WDB也通过网络连接。尝试在Tornado中配置一个Target Server连接地址为目标机IP。如果WDB能连上说明网络是通的问题出在Telnet服务本身。6.3 系统运行不稳定或性能差现象: 系统能启动但运行程序时偶尔崩溃或感觉响应缓慢。排查与优化:内存分配: 检查config.h中的LOCAL_MEM_SIZE和RAM_HIGH_ADRS/RAM_LOW_ADRS定义。确保为VxWorks分配了足够的内存。在VirtualBox设置中也可以适当增加虚拟机的内存大小。时钟中断: VxWorks严重依赖系统时钟中断。在VirtualBox中确保虚拟机的“系统-主板”设置中启用“硬件时钟”使用“UTC”。有时将“扩展特性”中的“启用HPET”勾选或取消勾选可以解决时钟源不稳定的问题。处理器设置: 尝试将虚拟机的CPU执行上限调高并确保“启用PAE/NX”已勾选。如果宿主是多核CPU可以尝试给虚拟机分配多个CPU但要注意VxWorks SMP支持需要额外配置。关闭虚拟化特性: 对于非常老的BSP和VxWorks版本可以尝试在VirtualBox的“系统-处理器”设置中取消勾选“启用嵌套分页”和“启用VT-x/AMD-V”如果宿主CPU支持。这有时能解决一些兼容性问题但会牺牲性能。6.4 编译错误与BSP适配现象: 在make bootrom或编译vxWorks工程时出现编译错误。解决思路:路径与权限: 确保Tornado安装在无空格路径并且你有该目录的读写权限。torvars.bat必须正确执行。工具链版本: Tornado 2.2自带了一套GNU工具链如cc386。确保你的系统PATH环境变量没有其他版本的GCC工具链干扰。BSP文件完整性: 不要直接修改config.h的原始副本。建议先备份或者在Tornado工程中通过prjParams.h进行覆盖式配置。很多编译错误源于config.h中的宏定义冲突。查阅修改历史: 提供的config.h文件头部有详细的修改历史modification history。关注最近的一些修改例如对于Pentium4非对称多处理器的支持、MMU 36位寻址等。如果你虚拟的CPU是较新的型号可能需要启用或禁用某些特定于CPU家族的宏如INCLUDE_MMU_P6_36BIT。经过上述步骤的细致配置和问题排查你应该能在VirtualBox中成功运行起VxWorks并建立起一个稳定的开发调试环境。这个环境对于学习VxWorks操作系统、进行驱动或应用的原型开发、以及兼容性测试来说是一个非常高效且成本低廉的方案。相比于VMwareVirtualBox在运行这类老式实时系统时我个人的体验是中断响应和I/O性能似乎更加稳定可预测当然这可能与具体版本和宿主机配置有关。最关键的是通过亲手配置一遍你对VxWorks的引导过程、BSP的作用以及虚拟化环境的网络配置会有更深刻的理解。