Shared Source Microsoft Device Emulator初体验
微软最近发布了Device Emulator 1.0的源代码,我也乘机下了一个,准备研究一下。首先提醒大家的是,模拟器的源代码是Shared Source,而不是Open Source,大家一定看清楚license,以免将来有不必要的麻烦。
Device Emulator的代码直接可以在微软网站上找到,是一个zip压缩包,直接下载就好了。下载地址如下:
http://www.microsoft.com/downloads/details.aspx?familyid=faa8c81d-7316-4461-a0ed-6c95b261ddcd&displaylang=en
解压之后,我们打开后可以找到一个DeviceEmulator.sln的文件,该文件用Visual Studio 2005打开。如果直接编译的话会报错,我们还需要再下载两个Lib:Zlib 1.2.3和LibPNG 1.2.8。我们可以分别在http://www.zlib.net/ 和http://www.libpng.org/pub/png/libpng.html 上找到这两个库的源代码,我下载的是zip的压缩文件。解压后,放到/ SharedSourceDeviceEmulator10/features的zlib和libpng这两个目录中。看来微软写程序的时候也会用到人家的类库,这点我们也要学习一下。
现在再进行编译的话,就可以编译通过了。我还没弄清楚如果让模拟器运行起来,这个问题下次再说。大概把代码文件的结构翻译一下,让大家知道每个文件大体是做什么用的。
Boards目录下包括所有的关于主板模拟的代码,这些代码是作为公共代码被所有主板使用的,但是一些文件只在指定的主板中使用。下面是该目录的文件列表:
COMInterface.cpp:实现了COM接口和其他与Visual Studio整合的host代码
Config.cpp:实现了EmulatorConfiguration类,用于存储全局配置信息
LoadBIN_NB0.cpp:加载*.bin和*.nb0文件到模拟器中
Main.cpp:包含WinMain和一些misc.代码
Mappedio.cpp:被emulator.cpp调用的转换代码,实现内存映射设备I/O
PCMCIADevices.cpp:实现公共PCMCIA设备。当然只有NE2000网卡被实现
ResourceSatellite.cpp:包括了加载本地化资源DLL,并获取资源的代码
ScancodeMapping.cpp:将Windows虚拟键值映射成IBM AT键盘扫描码。被skin引擎使用,skin的按键事件被映射成IBM AT扫描码
State.cpp:实现保存状态和恢复状态代码
VPCNet.cpp:封装Connectix Virtual Switch网络驱动
WinInterface.cpp:显示模拟器的Windows UI公共代码,它负责管理Win32窗体,接受Windows键盘消息,控制菜单,与Skin引擎通讯。
Boards/SMDK2410:实现了三星2410主版的模拟
Board.cpp:实现SMDK 2410主板模拟(RAM/Flash等)
Devices.cpp:实现SMDK 2410外围设备和SMDK2410模拟器UI的指定部分,作为LCD模拟的一部分
mappediodevices.h:定义SMDK 2410外围设备
vktoscan.cpp:从Win32虚拟键值到SMDK 2410键盘OEM扫描码
cpus目录下是CPU模拟的代码:
entrypt.h:从”guest”地址到JIT代码x86地址的映射表
redblack.*:被入口点管理器使用的红黑树(还用到了红黑树?找本数据结构去看看……)
tc.* :转换缓存管理器,用于管理存储JIT代码的内存
ARM目录:包括ARM到x86的JIT
ARMCpu.cpp:ARM/Thumb JIT编译器的核心
vfp.cpp:模拟ARM Vector Floating Point (VFP)协处理器
MMU.cpp:实现ARM处理器的MMU,包括TLB模拟,guest virtual-to-physical地址转换和内存页保护。guest virtual-to-physical地址转换是boards/*/board.cpp指定完成的
Entrypt.cpp:实现了从ARM/Thumb指令地址到JIT x86的映射表
Debugger.cpp:部分支持用于WinCE PB ICE的eXDI调试借口
Features目录:模拟器使用的公共库文件代码,不针对任何主板和CPU
LibPNG:.PNG文件支持库
Zlib:Zlib数据压缩程序
Skins:皮肤引擎,加载XML皮肤描述文件、位图,管理热区等。很多代码都是从Connectix模拟器拷贝过来,并按DeviceEmulator的要求修改的
Include目录:公共头文件
Board.h:主板模拟器的公共接口
Config.h:全局EmulatorConfiguration对象
CPU.h:CPU模拟器的公共接口
Emulator.h:公共全局头文件
Resource.h:定义可用的本地资源
Resources.rc:被所有模拟器共享的本地资源
ResourceSatellite.h:访问本地资源DLL
State.h:保存和恢复状态
Syscall.h:被测试配置作为CPU和主板的接口使用,实现ARM调用x86Win32 API
WinController.h:Win32 UI
XMLSkin.h:skin接口
另外说一句,Device Emulator的文档都在docs目录中,不是很多,只是对主要部分有一个大概说明,没办法看源代码去吧。找个时间让模拟器跑起来再说。
微软最近发布了Device Emulator 1.0的源代码,我也乘机下了一个,准备研究一下。首先提醒大家的是,模拟器的源代码是Shared Source,而不是Open Source,大家一定看清楚license,以免将来有不必要的麻烦。
Device Emulator的代码直接可以在微软网站上找到,是一个zip压缩包,直接下载就好了。下载地址如下:
http://www.microsoft.com/downloads/details.aspx?familyid=faa8c81d-7316-4461-a0ed-6c95b261ddcd&displaylang=en
解压之后,我们打开后可以找到一个DeviceEmulator.sln的文件,该文件用Visual Studio 2005打开。如果直接编译的话会报错,我们还需要再下载两个Lib:Zlib 1.2.3和LibPNG 1.2.8。我们可以分别在http://www.zlib.net/ 和http://www.libpng.org/pub/png/libpng.html 上找到这两个库的源代码,我下载的是zip的压缩文件。解压后,放到/ SharedSourceDeviceEmulator10/features的zlib和libpng这两个目录中。看来微软写程序的时候也会用到人家的类库,这点我们也要学习一下。
现在再进行编译的话,就可以编译通过了。我还没弄清楚如果让模拟器运行起来,这个问题下次再说。大概把代码文件的结构翻译一下,让大家知道每个文件大体是做什么用的。
Boards目录下包括所有的关于主板模拟的代码,这些代码是作为公共代码被所有主板使用的,但是一些文件只在指定的主板中使用。下面是该目录的文件列表:
COMInterface.cpp:实现了COM接口和其他与Visual Studio整合的host代码
Config.cpp:实现了EmulatorConfiguration类,用于存储全局配置信息
LoadBIN_NB0.cpp:加载*.bin和*.nb0文件到模拟器中
Main.cpp:包含WinMain和一些misc.代码
Mappedio.cpp:被emulator.cpp调用的转换代码,实现内存映射设备I/O
PCMCIADevices.cpp:实现公共PCMCIA设备。当然只有NE2000网卡被实现
ResourceSatellite.cpp:包括了加载本地化资源DLL,并获取资源的代码
ScancodeMapping.cpp:将Windows虚拟键值映射成IBM AT键盘扫描码。被skin引擎使用,skin的按键事件被映射成IBM AT扫描码
State.cpp:实现保存状态和恢复状态代码
VPCNet.cpp:封装Connectix Virtual Switch网络驱动
WinInterface.cpp:显示模拟器的Windows UI公共代码,它负责管理Win32窗体,接受Windows键盘消息,控制菜单,与Skin引擎通讯。
Boards/SMDK2410:实现了三星2410主版的模拟
Board.cpp:实现SMDK 2410主板模拟(RAM/Flash等)
Devices.cpp:实现SMDK 2410外围设备和SMDK2410模拟器UI的指定部分,作为LCD模拟的一部分
mappediodevices.h:定义SMDK 2410外围设备
vktoscan.cpp:从Win32虚拟键值到SMDK 2410键盘OEM扫描码
cpus目录下是CPU模拟的代码:
entrypt.h:从”guest”地址到JIT代码x86地址的映射表
redblack.*:被入口点管理器使用的红黑树(还用到了红黑树?找本数据结构去看看……)
tc.* :转换缓存管理器,用于管理存储JIT代码的内存
ARM目录:包括ARM到x86的JIT
ARMCpu.cpp:ARM/Thumb JIT编译器的核心
vfp.cpp:模拟ARM Vector Floating Point (VFP)协处理器
MMU.cpp:实现ARM处理器的MMU,包括TLB模拟,guest virtual-to-physical地址转换和内存页保护。guest virtual-to-physical地址转换是boards/*/board.cpp指定完成的
Entrypt.cpp:实现了从ARM/Thumb指令地址到JIT x86的映射表
Debugger.cpp:部分支持用于WinCE PB ICE的eXDI调试借口
Features目录:模拟器使用的公共库文件代码,不针对任何主板和CPU
LibPNG:.PNG文件支持库
Zlib:Zlib数据压缩程序
Skins:皮肤引擎,加载XML皮肤描述文件、位图,管理热区等。很多代码都是从Connectix模拟器拷贝过来,并按DeviceEmulator的要求修改的
Include目录:公共头文件
Board.h:主板模拟器的公共接口
Config.h:全局EmulatorConfiguration对象
CPU.h:CPU模拟器的公共接口
Emulator.h:公共全局头文件
Resource.h:定义可用的本地资源
Resources.rc:被所有模拟器共享的本地资源
ResourceSatellite.h:访问本地资源DLL
State.h:保存和恢复状态
Syscall.h:被测试配置作为CPU和主板的接口使用,实现ARM调用x86Win32 API
WinController.h:Win32 UI
XMLSkin.h:skin接口
另外说一句,Device Emulator的文档都在docs目录中,不是很多,只是对主要部分有一个大概说明,没办法看源代码去吧。找个时间让模拟器跑起来再说。