Table of contents
FX!32 介绍
FX!32 是一个商业仿真软件,允许 Intel x86 的 Win32 程序运行在基于 DEC Alpha 的 Windows NT 的系统上(1997)。
- 开发公司:Digital Equipment Corporation
- 开发时间:1997
- 指令集翻译:x86 -> Alpha
- 关键词:剖析(Profile)、透明(transparent)
FX!32 组成
三个可互操作的部分加一个服务器:
- 提供透明执行的运行时环境(Runtime Environment)
- 二进制翻译器(Binary Translater)
- 后台代码优化器(Code Optimizater)
- 协调它们的服务器(Server)
执行过程:
- 翻译器透明执行程序,生成执行的配置文件(Profile);
- 针对热点代码,后台优化器生成 Host 代码(Alpha);
- 将生成代码输入数据库中(image block header -> hash -> image block ID);
- 下次执行时根据 ID 调用 Host image。
数据库内的 image block 条目(实际上是 DLL 文件):
- image block ID
- 翻译后的 Alpha code block
- 两个 section:
- 包含 x86 image 引用的重定位信息的部分(如果 x86 image 未在其首选基地址加载 则必须重新定位这些引用);
- x86 code entry -> Alpha code entry 地址对
加载 x86 image 后,运行时开始模拟 x86 指令。当模拟器解释 CALL 指令时,它会在哈希表中查找目标 x86 地址。如果存在对应的翻译地址,则仿真器转移到翻译代码。模拟器还生成供翻译器使用的配置文件数据(Profile),其中包含以下信息:
- 作为 CALL 指令目标的地址;
- 用于间接跳转的源地址/目标地址对;
- 进行未对齐引用的指令地址记忆。
每当模拟相关指令时,通过将值插入运行时哈希表来收集配置文件数据。例如:
- 当模拟 CALL 指令时,模拟器会记录调用的目标;
- 当卸载 image block 或应用程序退出时,将处理运行时维护的哈希表,并写入该 image block 的 Profile;
- 于此同时,如果该 image block 是热点代码,将会调用翻译器;
- Server 将翻译后的 Alpha code block 和 Profile 进行处理,传入数据库;
- 如果非热点代码,Server 处理此 Profile,将其与任何先前的 Profile 合并。