VxWorks入门教程06:虚拟机中运行
系列索引:VxWorks入门教程索引
在下载的VxWorks安装包中,包含了一份在虚拟机下安装测试的文档,我们按照这个文档测试一下。
VxWorks 6.8.3 + VxWorks Workbench 3.2.3 + VMware 16.1.2 + MS-DOS 6.22 软盘版
按照FTP连接的主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统。
编译BSP
1、找到WorkBench的安装目录,目录名为WindRiver,找到vxworks-6.8目录,进入找到target目录,进入找到config目录,进入找到pcPentium4目录
Makefile
Makefile文件控制镜像的创建,在Makefile文件里使用了将近135个宏,最简单的Makefile文件要包含以下的宏:
- CPU:目标板CPU的类型;
- TOOL:主机的make工具,为GNU;
- TGT_DIR:target路径,默认为$(WIND_BASE)/target;
- TARGET_DIR:BSP目录名;
- VENDER:目标板生产商名;
- BOARD:目标板名;
- ROM_TEXT_ADRS:boot ROM的入口地址(以16进制表示,并且与config.h文件定义相同);
- ROM_SIZE:ROM的大小;
- RAM_LOW_ADRS:加载vxWorks的目标地址;
- RAM_HIGH_ADRS:boot ROM拷贝到RAM的目标地址;
- HEX_FLAGS:特殊结构的标记,用于产生S-记录文件;
- MACH_EXTRA:扩展文件,用户可以加入自己的目标模块;
- 除此以外,Makefile文件还需要包括以下文件:
$(TGT_DIR)/h/make/defs.bsp
:Vxworks系统运行的标准变量定义;$(TGT_DIR)/h/make/make.$(CPU)$(TOOL)
:提供了特别的目标机结构和一套编译工具,如make. ARM7TDMI_Tgnu;$(TGT_DIR)/h/make/defs.$(WIND_HOST_TYPE)
:提供了与主机系统有关的定义;- rules.bsp:在创建目标文件时所需要的规则;
rules.$(WIND_HOST_TYPE)
:指出创建目标文件时所需的从属文件表;- 如果没有用all目录下的文件而是拷贝到bspname下修改并使用,需要定义与这些文件有关的宏,如 BOOTINIT=bootInit.c 这样在创建镜像时就不会用all目录下的文件而使用bspname目录下的相应文件了;
- 在Makefile文件里凡是16进制数前面都无需加“0x”;
bspname.h
根据具体目标板设置串行接口、时钟以及I/O设备等。在该文件中必须包含以下内容:
- 中断向量/级别
- I/O设备地址
- 设备寄存器位的含义
- 系统和附加时钟参数(最大和最小速率)
config.h
根据目标板的具体情况配置宏定义,注意ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADRS、RAM_HIGH_ADRS要与Makefile文件里定义的一致,LOCAL_MEM_LOCAL_ADRS和LOCAL_MEM_SIZE要正确。
romInit.s
这是系统上电后运行的第一个程序,根据具体目标板对寄存器和CPU进行设置;以CPU为ARM7TDMI为例,romInit.s 需要进行的工作有:
- 保存启动方式:对于冷启动,如果CPU配置的是HIGH VECTORS,就设置入口地址为0xFFFF0000,否则设置入口地址为0x00000000;
- 屏蔽中断:通过设置cpsr的I_BIT和F_BIT都为1来实现,还要设置中断寄存器为关模式,同时设定运行模式为SVC32模式;
- 初始化堆栈指针pc和sp:堆栈指针sp指向STACK_ADRS,这个宏的定义为当镜像为驻留ROM时,该宏值为_sdata,当镜像为非驻留ROM时该宏值为_romInit,这两个地址经过地址映射后都指向被拷贝镜像在RAM的目标地址;
- 初始化cache,屏蔽cache;
- 根据具体目标板的需要初始化其他寄存器;
- 指针跳转到romStart()函数并执行;
sysALib.s
与romInit.s文件实现的功能相似,但如果在romInit.s文件里对DRAM和内存控制器进行了初始化在这里不再进行这项工作;
复制到config目录,重命名为Pentium4(自己取名,最好不要带空格或什么特殊符号)
我们要修改编译bootrom、VxWorks的配置头文件Config.h中定义的一些参数,使编译出来的系统引导程序bootrom和VxWorks的映象符合我们的要求;
修改config.h
1、定位到目录C:\WindRiver\vxworks-6.8\target\config\Pentium4
并打开该目录下 config.h 文件;定位到INCLUDE_CPU_PROBE
,
1 |
|
更改成如下:
1 |
|
2、定位到定义 DEFAULT_BOOT_LINE 宏的地方,
1 |
|
修改预处理条件 CPU = = PENTIUM4
分支下的定义如下:
1 |
|
这里的h(host)地址表示你的主机IP地址,可以先修改为主机IP地址,或者随便填一个IP地址,之后修改主机地址为该地址,e(target)地址表示VxWorks系统目标机的IP地址,只需要和主机IP地址在同一个网段内即可,u=target pw=target是FTP下载的用户名和密码,都可以根据自己实际情况修改,最好使用target,简单易记。
3、定位到INCLUDE_ATA,
1 |
|
在前面一句添加#undef INCLUDE_FD,如下所示:
1 |
|
4、定位到/* Network driver options: VxBus drivers */
1 |
|
作如下修改:
1 |
|
5、定位到INCLUDE_LN_97X_END,
1 |
|
将其定义上,修改如下:
1 |
|
6、定位到INCLUDE_PC_CONSOLE,
1 |
|
将其设成定义的,如下所示
1 |
|
7、定位到 #if(SYS_WARM_TYPE == SYS_WARM_BIOS),
1 |
|
修改如下:
1 |
|
修改configNet.h
1、定位到/* max number of END ipAttachments we can have */
1 |
|
在上面添加如下内容:
1 |
|
2、定位到/* Atheros AR521X WLAN Support */
1 |
|
在上面添加如下内容:
1 |
|
添加In97xEnd.c
将C:\WindRiver\vxworks-6.8\target\src\drv\end
目录下的ln97xEnd.c拷贝进你的Pentium4目录下,
并作如下修改,定位到:
1 |
|
添加宏如下:
1 |
|
添加Sysln97xEnd.c
由于workbench内本身没有提供,因此将我们提供的Sysln97xEnd.c移植到你的Pentium4目录下即可。
与原文件不同的地方在于:
1、定位到/* map a 4Kb 32-bit non-prefetchable memory address decoder */
1 |
|
2、定位到ln97xPciResources[ln97XUnits].bar[0] = ioBase;
1 |
|
修改makefile文件
定位到EXTRA_DEFINE,
1 |
|
作如下修改:
1 |
|
修改sysNet.c
1、定位到# include “sysUltraEnd.c”
1 |
|
添加内容如下:
1 |
|
2、定位到LOCAL VEND_ID_DESC vendorIdEnet [] =
1 |
|
修改内容如下:
1 |
|
当然如果有现有的文件,直接复制覆盖就可以了。
2、打开Workbench3.2,Workspace就选择WindRiver目录下的workspace目录
3、File->New->Wind River Workbench Project,选择Wind River VxWorks 6.8,然后Next
4、Build type选择Boot Loader / BSP Project,然后Next
5、Project name任取,最好与BSP相关,Location选择默认的in workspace,然后Next
6、Board support package选择步骤1中经过修改的Pentium4目录,Tool chain选择gnu,勾上Copy files to project,然后Finish
7、右键选中项目,选择Build Project或者Rebuild Project进行构建
8、构建完成后,右键选中项目,选择Open Wind River VxWorks 6.8 Development Shell,打开命令行,cd进入Pentium4目录后,输入make bootrom.bin命令,将生成bootrom.bin文件
9、找到workspace目录,找到该项目目录,在项目目录下找到Pentium4目录,进入并找到生成的bootrom.bin,复制出来,并修改后缀名为.sys,后续该文件作为引导程序
10、找到vxload.com和vxsys.com两个文件(手动搜索,或者一般在XX\WindRiver\vxworks-6.8\host\x86-win32\bin目录下),与上一步得到的bootrom.sys放在一起,以待后续使用
生成VxWorks镜像
根据具体需要在命令行环境下利用Makefile创建各种镜像,也可以在Tornado的集成环境下Build菜单中选择Build Boot ROM来创建各种类型的Boot ROM;
除此以外,如果系统硬件包括串口,还要根据具体情况修改sysSerial.c文件;如果包含网络部分要修改configNet.h;如果包含NVRAM要修改bootnv.h文件。总之,BSP的开发要根据具体目标板的硬件进行。
1、打开Workbench3.2,Workspace就默认为WindRiver目录下的workspace目录
2、File->New->Other,在Wizards内输入VxWorks image查找并选择VxWorks Image Project,然后Next
3、Project name任取,最好与Image相关,Location选择默认项in workspace,然后Next
4、4.Based on选择an existing project,Project中将显示此时workspace中的项目,选择第2章节中创建好的BSP项目,然后Finish
5、右键选中项目,选择Build Project或者Rebuild Project构建
6、找到workspace目录,找到该项目目录,在项目目录下找到default目录,进入并找到生成的vxWorks以及vxWorks.sym,复制出来,后续这两个文件将作为VxWorks系统文件通过FTP引导系统
VxWorks虚拟机安装
1、首先使用DOS622镜像文件创建虚拟机,镜像文件格式为IMG,大小为1.44MB,软盘的大小。
2、使用VMware,新建虚拟机->典型->稍后安装操作系统->其他(MS-DOS)->自定义名称(默认为MS-DOS)和位置->使用默认最大磁盘大小2GB,将虚拟磁盘存储为单个文件->完成
3、打开上一步创建的虚拟机设置,在硬件部分“添加”“软盘驱动器”
4、软盘添加“完成”后,选择软盘,勾选“启动时连接”,以及“使用软盘映像文件”,并点击“浏览”选择提供的DOS662.img文件
5、选择CD/DVD,取消勾选“启动时连接”,修改内存大小为256MB(适当大小即可)
6、完成设置后,开启该虚拟机,进入开始界面,选择第三个选项Other IDE CD-ROM
7、选择3后进入真正的DOS界面,开始进行硬盘分区,输入fdisk
8、选择1,建立DOS分区
9、选择1,建立一个主分区
10、选择Y,此时询问这个分区是否使用全部的空间,由于我们只需要一个分区就可以,因此选择Y
11、输入任意键,虚拟机将重启
12、重新选择3 Other IDE CD-ROM,进行主分区的格式化,输入format c: /s
,这里输入Y确认
13、这里询问是否填写卷标,由于并不需要所以直接回车即可
14、此时已经有主分区C盘了,关闭虚拟机,在虚拟机设置中选择硬盘,选择“映射”,取消勾选“以只读模式打开文件”后确定,弹出警告点“是”即可,由此将打开该虚拟机的硬盘空间
当时测试的是Windows10,在某一次更新之后,就无法实现虚拟磁盘映射了。经过测试,几乎所有Windows10版本都是这样,没办法,我只能在Win7上测试。
15、将章节2中的三个文件放入盘中后,在硬盘处“断开连接”,重新开启虚拟机,依然选择3,输入c:进入c盘(即主分区)
16、输入dir,可以看见三个文件已经在盘中了
17、输入vxsys c: 命令,输入y确认
18、由此bootrom.sys成功设置为引导程序,关闭虚拟机,在虚拟机设置中选择软盘,取消勾选“启动时连接”,再次开启虚拟机,VxWroks系统虚拟机安装完成,其中IP地址为172.18.101.124,也就是所提供的config.h文件内设置的地址
发现与我们修改的不一样,host的值是奔腾的值,我们修改错了。重新来一遍上面的步骤。
正常的效果应该是
19、到主机中,设置主机IP为h的值
我的h值就是根据主机IP设置的。
20、在C:\WindRiver\vxworks-6.8\host\x86-win32\bin下找到wftpd32.exe,使用该程序进行FTP的连接,最好将该软件发送到桌面快捷方式以便使用
21、在任意位置创建一个文件夹,用来给目标机提供FTP文件目录,方便起见,我们直接在C盘下创建一个名为ftp的文件夹,将之前得到的vxWorks
,vxWorks.sym
两个文件放入其中
22、打开wftpd32.exe,Security->Users/Rights->New User->创建一个名为target,密码为target的用户(这个用户名密码是在config.h文件修改时设定好的)
23、用户创建好后选择该用户,在Home Directory内填入C:\ftp,即21步中创建的文件夹,然后选择“Done”
24、重启VxWorks虚拟机,此时虚拟机将通过FTP连接载入VxWroks系统,完成
25、其中,如果在章节3中的文件,只将vxWorks文件放入FTP文件目录而不放置vxWorks.sym,VxWorks系统依然可以跑起来,但在命令行下将没有各种基本命令
我们已经利用基于VxWorks的BSP开发包成功的进行了线缆调制解调器的底层软件开发。在开发过程中深感BSP在整个系统软件中的重要性——没有正确的BSP软件,整个系统的启动和运行也不会正确。另外需要强调的是:BSP的概念只是针对嵌入式操作系统而言的,而像DOS、WINDOWS、UNIX等BIOS操作系统是无BSP可言的。对同一目标板而言,不同操作系统的BSP在本质上是一样的,但是不同的操作系统将提供不同的支持库,另外在BSP结构上也可能会有所不同,在做BSP移植的时候应该注意。
问题解决
mmuI86Enable
如果出现mmuI86Enable
和undefined reference ***
之类的错误,表示编译连接的库中没有链接mmuI86Lib.o
这个库。
在Makefile中添加上就可以了
1 |
|
当然,要把位于arch/i86/
下的mmuI86Lib.c
复制到奔腾4目录下。
DOSIMG
DOSIMG版本经过测试7.1版本是不行的,现在使用的是6.22版本,不知道其他版本行不行。
本文附属的代码和编译结果在VxWorks_Freshman中,可以直接替换文件。