免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

VxWorks 6.9虚拟机搭建指南:VMware上运行与Workbench调试完整教程

VxWorks 6.9虚拟机搭建指南:VMware上运行与Workbench调试完整教程 最近好几个做嵌入式移植的朋友跑来问我VxWorks 6.9能不能在VMware上跑起来我的回答是能而且配合Wind River Workbench做在线调试比在真实板卡上还顺手。但这里有个前提——你千万别用装Windows、Ubuntu的思路去搞它。VxWorks不是拿来“安装”的它是一套实时操作系统正确的玩法是先让一个bootrom把内核拉起来然后再通过串口或网络跟它交互。这篇教程是我在VMware Workstation 16 Pro上折腾VxWorks 6.9的完整记录从虚拟机配置、启动镜像制作、串口终端连接、网络与Workbench调试再到最终能跑起来的过程全部展开写。准备把VxWorks放到虚拟化环境里做验证、做演示或者做CI构建的朋友可以照着走一遍。1. 先理清思路虚拟机里的VxWorks为什么和普通系统不一样1.1 VxWorks 6.9到底是什么以及它适合跑在VMware上吗VxWorks是风河Wind River旗下的实时操作系统6.9这个版本在工业控制、网络设备、医疗仪器和航空航天里非常常见至今还有大量存量项目。它的调度延迟低、内核可裁剪能在极小的内存里运行这些是Linux给不了的。正因为它是嵌入式RTOS很多开发者的惯性思维是“我能不能下个ISO镜像然后在VMware里一步步安装”答案是不能。VxWorks没有独立的安装程序也没有包管理器。它不像Windows那样有“安装到磁盘”的概念而是一个内核镜像通过引导加载器加载到内存里直接运行。你所谓的“装系统”实际是把VxWorks镜像做成可引导介质通过虚拟机的软驱、光驱或者网络启动。VMware能不能跑VxWorks 6.9取决于你拿到的BSPBoard Support Package板级支持包是否覆盖了x86体系结构。一般VxWorks 6.9安装目录下的target/config里会带x86或者pcPentium4这类BSP它们的目标硬件就是PC兼容机VMware虚拟出来的硬件也是PC兼容机所以完全能跑。有不少人把它跑在QEMU里但QEMU的默认设备模拟偏精简某些中断控制器和时钟行为与VxWorks BSP预期差异较大反而不如VMware省心。1.2 引导链bootrom和vxWorks镜像是两件事在VxWorks的世界里引导启动通常分两步。第一步是bootrom。它是一段很精简的引导代码负责初始化CPU、内存控制器、串口和最基本的网络接口然后按照预设的bootline参数从网络、磁盘或者内存中去加载真正的VxWorks内核镜像。bootrom很小通常几十K到一两百K当年之所以用软盘引导就是因为它小到能塞进软盘。第二步是vxWorks镜像。这就是真正的实时操作系统内核加上你裁剪出的各种组件、驱动和应用程序。它在bootrom完成初始化之后被加载进内存然后接管整个系统。理解了这一步你才能在VMware里做出正确的配置虚拟机的BIOS要先从软驱或者光驱引导加载bootrombootrom再从指定位置加载vxWorks镜像。很多人在虚拟机上卡住是因为压根没有做这一步他们打开虚拟机直接看到一片黑以为系统坏了其实只是没有引导层。BSP在这里扮演的角色也很关键。它负责把VxWorks的内核抽象层和具体硬件绑定起来比如串口地址、中断号、网卡驱动的注册、系统时钟的初始化等等。你选什么样的BSP决定了你在VMware的虚拟机设置里该选什么网卡类型、什么串口参数。别一上来就默认用最新的设备型号VxWorks 6.9的BSP往往是针对十年前的硬件写的VMware默认给Linux虚拟机配置的VMXNET3、SATA硬盘这类现代虚拟设备VxWorks反而可能认不出来。2. 虚拟机配置的几个关键参数软驱、串口、网卡缺一不可2.1 创建虚拟机时先别急着选Linux模板在VMware Workstation Pro里新建虚拟机时很多人习惯性选“Ubuntu”或者“Other Linux 64-bit”模板这会引入很多VxWorks根本用不到的设备。我的推荐是选“Other (64-bit)”或者“Other”固件选BIOS不要选UEFI。因为VxWorks 6.9的bootrom对UEFI引导支持本来就弱你用UEFI去启动很可能卡在启动阶段连bootrom都看不见。硬件参数我实测下来这样配置比较稳配置项推荐值说明内存512MB ~ 2GBVxWorks内核本身占用很低给太多内存反而没有意义处理器1~2核单核足够多核需要配置多核支持组件徒增复杂度硬盘IDE 40GB不用太大关键是控制器选IDESATA支持在6.9里比较弱固件BIOS不要选UEFI软驱手动添加用于挂载bootrom镜像这一步是关键串口手动添加命名管道用于观察bootrom和VxWorks控制台输出网卡e1000e兼容性好VxWorks的Intel网卡驱动通常能识别声卡/打印机移除完全用不上在创建虚拟机的最后一步点“自定义硬件”里面把不需要的USB控制器、声卡、打印机都删掉然后手动添加软盘驱动器、串口和网络适配器。VMware默认的新虚拟机可能没有软驱你必须自己加。2.2 软驱、串口、网卡的具体配置方式软驱这一步很多人找不到。你需要在“虚拟机设置”里点击“添加”按钮然后在硬件类型里找到“软盘驱动器”。添加完成后在右侧选择“使用软盘映像”文件名处选择你后面会做好的bootrom.img。注意不是“物理驱动器”而是“软盘映像”文件。VMware会把一个img文件当作软驱里面的软盘来处理这样虚拟机一开机BIOS就能从软驱引导bootrom。串口设置比较容易被忽视。VxWorks的默认控制台输出走的是COM1也就是串口1。你在VMware里添加一个串行端口端口模式选“使用命名管道”路径填\\.\pipe\vxworks_com1另一端选“该端是应用程序”然后断开电源和唤醒事件。这样宿主机上的串口终端软件就能通过这个命名管道跟虚拟机里的VxWorks通信了。网卡类型建议选择e1000e。VMware的e1000e模拟的是Intel 82574L千兆网卡VxWorks的x86 BSP里通常有对应的end驱动VMXNET3虽然性能好但VxWorks 6.9默认不带VMXNET3的驱动你强行用它bootrom起来之后会发现找不到网络设备后面加载镜像和调试全都抓瞎。网络连接模式我推荐“仅主机模式Host-only”。这个模式会创建一个宿主机和虚拟机之间的私有网络不依赖外部DHCP和路由器网络行为更可控。VxWorks目标机和Workbench调试主机之间的IP地址可以自己指定不会和外部网络冲突。2.3 虚拟机文件位置和快照规划还有一个小建议在配置好虚拟机和系统之后一旦VxWorks能成功跑起来立刻做一个快照。比如把“刚启动到VxWorks shell”作为第一个快照“网络调试正常”作为第二个快照。VxWorks的BSP调试过程中经常会把配置文件改坏或者在内核里敲错命令导致系统卡死快照能帮你秒回状态。这是真实板卡给不了的便利。3. 制作可引导的bootrom与VxWorks镜像3.1 在Workbench里新建VxWorks Image项目VxWorks 6.9的IDE叫Workbench是基于Eclipse的。你在宿主机上装好Workbench并且确保有有效的Wind River License之后打开它新建一个“VxWorks Image Project”。新建工程时Workbench会让你选择BSP。这里一定要选x86体系的BSP对应你的VMware虚拟机。常见名字有pcPentium4、x86有些发行版本里会提供类似vmware的专用BSP如果有就直接选它如果没有就选兼容性最好的x86 BSP。接下来是组件配置。VxWorks 6.9把内核功能拆成了大量组件比如网络协议栈、文件系统、shell、目标代理等。你需要在组件图里勾选C / C 运行时库用于跑应用Kernel Shell方便启动后敲命令Target Management用于Workbench在线调试网络组件INET或INET6以及对应的网卡驱动end接口串口驱动确保COM1输出组件配置不是越多越好每多一个组件镜像体积就大一点启动时间也更长。建议最小化配置能跑起来再逐步加。配置完后执行编译生成的产物里会有两个关键文件bootrom.bin和vxWorks。bootrom.bin是引导层vxWorks是内核镜像。如果你打开代码生成目录可能还会看到bootrom_uncmp.bin、vxWorks.st这些派生文件我们主要用bootrom.bin和vxWorks。3.2 把bootrom.bin做成软盘镜像bootrom.bin本质上是原始二进制镜像它已经包含了引导扇区。只要把它原样写到虚拟软盘镜像里虚拟机开机后BIOS就会去执行扇区里的引导代码。因为你是在VMware里用软盘映像文件所以需要把单个的bin文件包装成一个标准的1.44MB软驱镜像文件。在Linux下做这个很简单# 创建一个1.44MB大小的空白镜像 dd if/dev/zero ofbootrom.img bs1474560 count1 # 把bootrom.bin写入镜像的最开始位置 dd ifbootrom.bin ofbootrom.img convnotrunc在Windows下我惯用的工具是WinImage。打开WinImage新建一个标准1.44MB软盘映像然后选择“磁盘→从文件导入”导入bootrom.bin最后另存为bootrom.img。这里有个细节需要注意bootrom.bin的实际大小可能不到1.44MB这不影响启动因为BIOS只读取磁盘第一扇区以及bootrom自己读取后续扇区文件后头全是0也无所谓。但要保证写入的是“物理偏移”的最开始处不能用普通的拖拽文件方式放进去那样会生成文件系统结构而bootrom不是FAT文件系统。用WinImage时必须用“导入磁盘映像/原始扇区”的方式而不是把文件拖进“浏览模式”。3.3 在虚拟机中挂载软盘镜像并启动做好bootrom.img之后回到VMware虚拟机设置把软驱映像文件指向它。然后打开虚拟机电源如果一切正常你能在串口终端上看到bootrom打印的启动信息。这里顺便说一下为什么我不推荐直接用ISO镜像引导。VMware可以启动ISO但VxWorks 6.9的bootrom默认支持从软驱、IDE硬盘、网络启动对“从光驱启动”这一行为的支持取决于BSP里有没有包含CD-ROM引导驱动。为了少踩坑软盘镜像是最稳妥的选择它最贴近VxWorks BSP当年设计的启动路径。3.4 另一种方式直接做可引导ISO如果你的BSP里带了mkisofs相关工具支持且你确认BSP支持El Torito软盘模拟引导那么也可以做ISO。做法是把bootrom.img作为“软盘模拟启动镜像”塞进ISOVMware的光驱去引导这个ISO。这样不需要添加软驱设备。但这种方式对BSP的要求比较高很多旧版x86 BSP根本不支持所以新手还是老老实实用软驱。4. 串口控制台连接启动后的第一面镜子4.1 先准备好串口终端工具VxWorks启动后不会像Windows那样弹出一个可爱的桌面它的标准输入输出在串口上。所以你必须先在宿主机上打开一个串口终端连接刚才创建的命名管道\\.\pipe\vxworks_com1。我用的是MobaXterm它的串口会话配置比较直观。你也可以用PuTTY的最新版选择Connection type为SerialSerial line填\\.\pipe\vxworks_com1Speed填115200。串口参数必须设置成和VxWorks一致通常为参数值波特率115200数据位8停止位1校验None流控None有些老BSP默认可能是38400或者9600但6.9的x86 BSP默认基本都是115200。如果连上去看到乱码优先检查波特率。4.2 启动bootrom后能看到什么开虚拟机电源串口终端里会立刻出现bootrom的打印类似这样VxWorks Boot 6.9 Copyright 1984-2012 Wind River Systems, Inc. CPU: x86 Version: 6.9 BSP version: 1.2 Creation date: ... Press any key to stop auto-boot...如果你手速够快在那个“Press any key to stop auto-boot”几秒倒计时里敲任意键就能进入bootrom的交互命令行提示符是一个-。如果不干预它会按照默认bootline自动尝试加载vxWorks镜像。默认bootline很可能是网络启动而此时网络什么都没配所以通常会加载失败。没关系这正好说明bootrom是活的。进入-提示符后可以敲?查看所有可用的bootrom命令。常用的是命令作用p打印当前bootline参数c进入交互式配置模式使用当前bootline启动b启动i显示网络接口信息我强烈建议你先敲p看看默认启动行写成什么样这有助于理解VxWorks的启动参数结构。bootline里包含设备名、目标机IP、宿主机IP、用户名、密码等是一串用空格和特殊符号分隔的参数。4.3 通过交互模式配置启动行在提示符下按cbootrom会开启一个简单的问答式配置。它会问你启动设备是什么比如fei、igbe、fd、tffs等你需要根据你BSP里的网卡驱动名称填。我用的x86 BSP配合e1000e虚拟网卡时设备名通常是fei或者igbe。如果你不确定可以在bootrom提示符输入i查看可用网络接口。配置启动行的时候有一个典型参数结构可以参考fei(0,0)host:vxWorks h192.168.70.2 e192.168.70.10 utarget pwtarget oae这里简单解释一下fei(0,0)表示用第一个fei网卡从0号设备启动host:vxWorks表示从主机加载名为vxWorks的内核镜像文件h是宿主机IPe是目标机VxWorks的IPu和pw是目标机FTP/TFTP登录用的用户名、密码o是其他启动选项a表示自动启动e表示是否打印错误信息如果你是基于软盘上的bootrom启动但是要通过网络加载vxWorks内核那么你需要在bootline里把启动设备指向网络接口。如果想把bootrom和vxWorks都塞到同一个软盘镜像里理论也可以不过还是分开更清晰。配置完之后输入启动bootrom就会按照你的bootline去网络上寻找vxWorks镜像并加载。4.4 如果连bootrom都看不到怎么办如果在串口终端上完全没有任何输出不要先怀疑VxWorks先检查几件事虚拟机串口是否设置为命名管道路径和你终端软件里填的一致终端软件的串口参数对不对VMware里串口选项“该端是应用程序”是否勾选有没有先启动终端软件再开虚拟机电源。还有一个很容易忽略的点每次给虚拟机断电再启动命名管道可能要被终端软件重新连接一次。MobaXterm有时候会断开需要断开会话重连一下。5. 网络联通与Workbench在线调试5.1 给VxWorks目标机配一个固定IP如果你的bootline里已经配置了e192.168.70.10那么VxWorks内核启动后会把这个IP配到对应的end网络接口上。这时候你就可以在宿主机上ping一下这个地址验证网络通不通。但我更常用的方法是在VxWorks的shell里直接配置网络尤其是当你第一次用本地软盘启动、没有配置网络启动参数的时候。进入shell后敲ifconfig可以查看当前网络接口状态再敲ifconfig end0 192.168.70.10 255.255.255.0 up这样风格的命令给接口配上IP。这里end0是网络接口逻辑名不同BSP可能不一样有些是fei0、igbe0打印接口信息看一眼就知道。建议把宿主机VMnet1仅主机模式网卡的IP设置为192.168.70.2掩码255.255.255.0VxWorks目标机设置为192.168.70.10。这样两个地址就落在了同一个网段通信没有任何阻碍。5.2 在Workbench里添加目标机打开Workbench找到“Target Management”或者“Targets”视图新建一个Target。连接方式选择“Network”填上VxWorks目标机的IP地址。Workbench会通过目标代理Target Agent和运行中的VxWorks建立连接。这里有个重要前提VxWorks镜像里必须包含“Target Management”组件否则Workbench连不上。如果你编译VxWorks Image时没有勾选这个组件镜像里就没有代理进程Workbench扫描目标机时会提示“Target Agent not responding”。解决办法是回到组件配置里把目标代理组件加进去重新编译vxWorks镜像再启动一次。连接成功后你可以看到目标机的CPU、内存、任务列表等信息。最爽的是可以在Workbench里直接下载内核、下载应用模块还能进行断点调试。比如你写了一个用户任务可以编译成.out文件通过Workbench的“Download”功能下载到目标机上运行并在此处设置断点单步执行。5.3 通过TFTP或者串口把vxWorks镜像加载进来如果你走的是网络加载方式宿主机上需要跑一个TFTP服务器把Workbench编译出来的vxWorks文件放在TFTP根目录下。bootrom启动时根据bootline里的host:vxWorks会去宿主机的TFTP服务器拉取这个镜像。TFTP服务器工具有很多Linux下可以用tftpd-hpaWindows下可以用OpenTFTP或者SolarWinds TFTP Server。注意Windows防火墙要放行UDP 69端口否则bootrom访问不到。如果你不想搭TFTP又不想把镜像固化到软盘里还有一个笨办法通过在串口终端前启动的bootrom用串口传输协议把vxWorks镜像传入内存。但这需要手工计算地址和长度操作繁琐我只在应急时候用。5.4 在线调试时的常用技巧Workbench连接上目标机后我习惯先打开“Kernel Shell”视图这样既能敲命令又能配合Workbench图形界面的任务管理和内存查看。组合使用比较顺手。还有一个小技巧给VxWorks目标机配置NFS或FTP共享根文件系统这样可以动态加载应用程序而不用反复重烧镜像。VxWorks 6.9支持NFS客户端你可以在宿主机上开一个NFS共享目录在VxWorks里mount到这个目录应用程序直接在共享目录里运行。虚拟化环境里这样做很舒服因为宿主机和虚拟机之间的网络就是隔离的VMnet速度和稳定性都有保障。6. 问题排查清单我踩过的那些坑6.1 串口无输出或者全是乱码先确认串口参数特别是波特率。如果波特率不对整个屏幕都是黑白噪音一样的乱码。再确认你终端连接的是不是VMware的命名管道而不是某个真实的COM口设备。还有一个坑是VMware的命名管道在Windows下需要终端软件用管理员权限打开否则连接会被拒绝。6.2 bootrom启动了但VxWorks内核加载到一半卡死这种“半路卡死”大多数是网卡驱动不匹配导致的。bootrom启动时可能还会打印设备信息如果它卡在“Attaching network interface”之类的地方大概率是网卡型号和BSP驱动不一致。解决方法是把VMware虚拟机的网卡从默认改成e1000e或者e1000不要用VMXNET3。如果你的BSP只支持老式e1000那你就选e1000。6.3 VxWorks起来之后鼠标键盘没反应很多人的第一反应是“坏了”。其实不是VxWorks默认就是串口控制台键盘鼠标只是它兼容PC硬件的附带功能不一定加载了相关驱动。你不需要鼠标键盘所有输入都在串口终端的shell里敲就行了。如果你实在想要一个带图形界面的VxWorks那需要额外配置图形组件和鼠标驱动虚拟化环境下性价比很低不推荐折腾。6.4 时钟和延时不准定时器忽快忽慢这个问题比较隐蔽。VxWorks BSP默认可能使用PC的i8254定时器而VMware虚拟化平台对某些定时器中断的虚拟化处理会有延迟导致taskDelay和系统时钟不太准确。处理方式是在BSP配置里强制指定使用某个时钟源比如改成HPET或者保持PIT模式并调整系统时钟频率。具体选项要看BSP头文件里的定义不同版本差异很大。我的建议是先不要浪费太多时间因为如果只是做功能验证轻微的时钟偏差不影响但如果你在对时间敏感的逻辑上调试就需要花点心思配置时钟源了。6.5 硬盘识别不到或启动时找不到磁盘文件系统VxWorks 6.9对SATA控制器的支持不完善你在VMware里给虚拟机配置硬盘时一定要把磁盘类型选成IDE。如果已经是IDE但还是识别不到检查BSP里是否启用了IDE/ATA驱动组件。VxWorks里访问磁盘需要文件系统组件的支持比如dosFs或rawFs。如果只是做实验完全可以不挂磁盘只从网络加载镜像这样最省事。6.6 VMware Tools千万不要装VMware Tools对Windows和Linux虚拟机是神器但对VxWorks来说没有任何意义。VMware Tools的安装包是给宿主机操作系统做的VxWorks没有设备驱动框架去装载它反而会引入未知的中断。6.7 保存状态之后再恢复可能导致网络假死VMware的挂起恢复机制在VxWorks这里偶尔会有问题。VxWorks内核运行中如果你用一个快照去恢复整个虚拟机可能网络、定时器和串口都恢复正常但网络连接变成半死状态ping不通也连不上。遇到这种情况直接在VxWorks shell里把网卡down掉再up一次通常就能恢复。如果不行就重启VxWorks毕竟它是RTOS常驻运行很久不是它的设计重点开发阶段频繁重启也正常。我在VMware里把VxWorks 6.9跑通之后最大的感受是虚拟化环境确实能省掉很多硬件上才有的烦心事比如串口线供电不稳、网卡接线松动但前提是你要理解VxWorks的引导流程和BSP机制。你把这个底层的逻辑理顺了再回来看VMware的设置每一步都显得非常自然。如果你也在折腾VxWorks 6.9的虚拟化环境希望这篇教程能帮你少走些弯路。
返回列表