Skip to content

FX!32

Published: at 03:42

Table of contents

Open Table of contents

FX!32 介绍

FX!32 是一个商业仿真软件,允许 Intel x86 的 Win32 程序运行在基于 DEC Alpha 的 Windows NT 的系统上(1997)。

FX!32 组成

三个可互操作的部分加一个服务器:

  1. 提供透明执行的运行时环境(Runtime Environment)
  2. 二进制翻译器(Binary Translater)
  3. 后台代码优化器(Code Optimizater)
  4. 协调它们的服务器(Server)

执行过程:

  1. 翻译器透明执行程序,生成执行的配置文件(Profile);
  2. 针对热点代码,后台优化器生成 Host 代码(Alpha);
  3. 将生成代码输入数据库中(image block header -> hash -> image block ID);
  4. 下次执行时根据 ID 调用 Host image。

数据库内的 image block 条目(实际上是 DLL 文件):

  1. image block ID
  2. 翻译后的 Alpha code block
  3. 两个 section:
  4. 包含 x86 image 引用的重定位信息的部分(如果 x86 image 未在其首选基地址加载 则必须重新定位这些引用);
  5. x86 code entry -> Alpha code entry 地址对

加载 x86 image 后,运行时开始模拟 x86 指令。当模拟器解释 CALL 指令时,它会在哈希表中查找目标 x86 地址。如果存在对应的翻译地址,则仿真器转移到翻译代码。模拟器还生成供翻译器使用的配置文件数据(Profile),其中包含以下信息:

  1. 作为 CALL 指令目标的地址;
  2. 用于间接跳转的源地址/目标地址对;
  3. 进行未对齐引用的指令地址记忆。

每当模拟相关指令时,通过将值插入运行时哈希表来收集配置文件数据。例如:

  1. 当模拟 CALL 指令时,模拟器会记录调用的目标;
  2. 当卸载 image block 或应用程序退出时,将处理运行时维护的哈希表,并写入该 image block 的 Profile;
  3. 于此同时,如果该 image block 是热点代码,将会调用翻译器;
  4. Server 将翻译后的 Alpha code block 和 Profile 进行处理,传入数据库;
  5. 如果非热点代码,Server 处理此 Profile,将其与任何先前的 Profile 合并。

参考资料

  1. FX!32 - Wikipedia
  2. FX!32 - A Profile-Directed BT
  3. Running 32-Bit x86 Applications on Alpha NT
  4. 虚拟机与二进制翻译技术拾遗 | 黎明灰烬 博客