Odin 是如何在 OS/2 上运行 Win32 程序的?

Odin 通过格式转换和 API 实现,让 Win32(Windows 95 / Windows NT)程序在 OS/2 Warp 上以原生方式运行,而不是靠模拟。它把 Windows 的 PE 格式 EXE/DLL 转换成 OS/2 使用的 LX 格式,并重新按 OS/2 应用的方式在内存中装配,同时提供一套 Win32 API 实现(Odin32 API)。因此程序由 CPU 直接执行,拥有普通 32 位 OS/2 程序的权限和限制,没有模拟层,也没有 Windows 会话或虚拟机。

转换与加载的两种方式

Odin 的二进制兼容性来自把 Windows 的 EXE 和 DLL 文件转换成 OS/2 能用的格式。转换和加载 Win32 程序的基本过程是:

  • 把 PE(Portable Executable,Win32 二进制格式)对象转换为 OS/2 的 LX(Linear eXecutable)格式;
  • 按 OS/2 应用应有的方式在内存中重新装配。

具体有两种做法:

方式 工具 特点
永久转换 PE2LX.EXE 直接把磁盘上的 EXE/DLL 转成 OS/2 格式
运行时动态转换 PE.EXE 加载器 磁盘上的可执行模块不被修改,同一份文件可同时在 Windows 95/98/NT 和 OS/2 上使用,更灵活

两种方式都可以借助 WIN32K.SYS 驱动实现自动化,并对用户完全透明:OS/2 进程(WPS、命令提示符等)可以像启动普通 OS/2 应用一样启动 Win32 二进制程序,转换和加载在启动时自动完成。转换或加载后的程序,外观和行为都与其他 OS/2 应用一致。

为什么它不是模拟器

Odin 与 IBM 曾提供的 Win-OS/2 有本质区别。Win-OS/2 通过模拟层、Windows“会话”或虚拟机来运行 Windows 3.1 程序;Odin 没有这些机制,代码由 CPU 直接执行,具备正常 32 位 OS/2 程序的全部权限和限制。

要让程序真正跑起来,它必须能访问与 Windows 中相同的 API 函数,也就是 Win32 API。Odin 的另一部分工作就是提供这些函数:用运行时库复刻 Win32 API 的功能。这也是 Odin 项目名称下软件的核心组成——既做二进制格式转换,又提供 Win32 API 的 OS/2 实现(Odin32 API),从而让 Win32 程序在 OS/2 上“几乎像本来就是为 OS/2 写的应用一样”运行,同时也让从 Win32 向 OS/2 的移植更容易。

在哪里获取资料和参与讨论

netlabs.org 是承载 Odin 项目的网站,页面上有 Project: Odin 的入口。围绕 Odin 的公开资源包括:

  • netlabs.org Wiki 上的 Odin 页面,可自由贡献内容;
  • 邮件列表 [email protected],可通过邮件订阅,也可在 gmane.org 上阅读。

如果你要判断某个 Win32 程序能否用 Odin 运行,可以先确认它依赖的 Win32 API 是否已被 Odin32 API 覆盖,再选择永久转换(PE2LX.EXE)或运行时加载(PE.EXE)方式;希望同一份文件在 Windows 和 OS/2 上共用时,动态转换更合适。

odin.netlabs.org