某台计算机上模拟其他计算机的历史已经很长,通常是为了使用遗留应用程序,或者是为了使用为更稳定、响应更快的 OS 的系统上运行流行的 OS 而编写的应用程序。随着 Linux™ 越来越流行,当开发人员规划将运行于非 Linux 系统上的二进制程序时,需要审视他们的选择。本文将研究模拟器的功能,并将详细地研究硬件模拟和软件模拟的问题。
通常,应用程序模拟以占据较大市场份额的平台为目标。例如,WINE 项目尝试去提供一个运行 Windows® 二进制程序的途径,因为 —— 面对现实吧 —— Windows 上的优秀应用程序比 Linux 上的多得多(尽管正如他们所指出的那样,WINE 不是模拟器(WINE Is Not an Emulator))。
不过,近年来 Linux 已经被证明是一个稳定而且全能的操作系统;因而,它的市场份额也有所增长。市场份额的增长激起了人们对模拟 Linux 的兴趣。本文评论了在其他系统上进行 Linux 二进制程序模拟的现状,并着重指出为了让人们更方便地在模拟环境中运行他们的二进制程序,开发人员应该紧记的一些问题。
有一些模拟层,比如 NetBSD 的 Linux 模拟层,只是提供某个环境的软件部分的模拟,从 Linux 程序库取得系统调用,并处理返回结果,使得看起来像是在使用 Linux 内核。其他的模拟层,比如 VirtualPC,可以模拟整台计算机,包括处理器。模拟处理器的速度会更慢,但是可以带来更好的兼容性。
发行版本格式的模拟器
尽管本文重点关注的是在其他平台上运行 Linux 二进制程序的方法,但是,经过编译的二进制程序发行版本同样占有一席之地。随着 Linux 模拟环境越来越普及,Linux 二进制程序格式成为发行简单程序(不给出源代码)的一个可行方法。Linux 二进制程序可以在多种系统上运行,无可否认,有时需要付出一些代价 —— 以 Linux 二进制程序格式作为通用发行版本格式还会遇到一些挑战。
就某些方面而言,完全硬件模拟器是进行模拟的最简单方式。很多工作都需要构建一个完全硬件模拟器,但是一旦您拥有这样一个模拟器,所有的事情就都可以迎刃而解。例如,用于 Macintosh 的 VirtualPC 版本 3 开始支持 Linux。
硬件模拟可以解决使用其他方式难以解决的问题。例如,我以前有一个 BIOS 闪存工具,仅以用于 DOS 的自解压缩的映像文件的格式发布。更糟糕的是,运行它的机器必须在传统的 ISA 软盘控制器上安装实际的软盘(我的 Windows 桌面机有一个 LS-120 驱动器)。通过模拟来解决这个问题吧!我在模拟器下运行该程序,将数据写入已经插入 Mac 的一个 USB 软盘驱动器。
虽然如此,想要在 Macintosh 或者任何其他非 x-86 机器上运行 x86 Linux 二进制程序的用户,为了尝试运行程序,可能要完全依赖于某种当前可用的 x86 模拟器。在类似这样的系统上,大部分工具程序将运行得非常好(虽然可能较慢)。要担心的惟一一个主要顾虑是,为了提高性能,这种系统的用户可能安装较小的或者较老的 Linux 发行版本。使用 32 MB 内存来运行模拟机器的那些人不可能运行最新版本的 KDE。
部分硬件模拟器
部分硬件模拟器是一个中间解决方案:它们模拟一台计算机,但是这台计算机只能是与它们实际上所在的计算机类型相同的计算机。由于执行的速度与宿主机器相当,所以类似这样的程序可以降低模拟的成本。此类模拟器的示例包括 Serenity Virtual Station 和 VMWare。
当您拥有用于多种操作系统的应用程序,而且需要同时运行它们时,这些系统最为实用。类似于完全硬件模拟,这样的系统将运行一个完全的 Linux OS 环境,只要您的程序能够适当地跨 Linux 系统移植,那么就没什么问题。不过,再次声明,Linux 的移植到较老版本的可移植性将有非常有用。使用虚拟机的人们可能愿意在这样的系统上运行一个较老的、占空间较小的 Linux 版本。
这就陷入了模拟器中的一个特别错综复杂的逻辑中。当执行二进制程序时,操作系统可能知道的足够多,可以核对相关的 Linux 二进制程序的 Linux 路径,而且它可能在那里安装 bash 的一个副本。但是,当您运行一个脚本时,内核不会将其看作是一个 Linux 二进制程序;它发现脚本附带有一个解释程序路径,当尝试加载解释程序时,它将不再运行于模拟模式之下。
I think the rationale behind is not just limited to anyone who write codes for Linux emulators, but general to anyone who intend to write programs that are across platforms.