虚拟机技术简介之四 — API层虚拟机
API层虚拟机的典型代表是开源项目Wine,它构造了一个Windows用户态应用程序和其它操作系统之间的适配层(Adapter Layer),当这些应用程序需要在其他操作系统下调用一个Win32 API函数时,Wine将把该调用转换成相应操作系统下对该函数的模拟实现。Wine系统在整个运行环境中起到的作用可以从三个角度理解。l 从Windows应用程序的角度看,Wine为其提供了Wind
API层虚拟机的典型代表是开源项目Wine,它构造了一个Windows用户态应用程序和其它操作系统之间的适配层(Adapter Layer),当这些应用程序需要在其他操作系统下调用一个Win32 API函数时,Wine将把该调用转换成相应操作系统下对该函数的模拟实现。
Wine系统在整个运行环境中起到的作用可以从三个角度理解。
l 从Windows应用程序的角度看,Wine为其提供了Windows软件运行环境的模拟,不过这并不是对处理器指令的模拟,而是对Win32 API函数的模拟。
l 从Linux及其内核的角度看,Wine形成Linux内核与Windows应用程序之间的一个中间层。它一方面为Windows应用程序提供了一套完整的动态链接库(Dynamic Link Library,DLL),一方面将应用程序和动态链接库中对Windows的系统调用转换成具有相似语义的Linux的系统调用。
l 从Windows的动态连接库和服务进程的角度来看,Wine是Windows关键组件以模拟方式在Linux上实现的移植。
图1 Wine体系结构
Wine未包含任何Linux内核模块,即Wine所有的组件均是在用户态实现的。Wine需要在Linux用户态下基于Linux系统调用来模拟实现Windows的系统调用。然而,系统调用类似于函数调用,要让两个这样的“函数调用”在调用上下文、输入参数、函数语义和返回结果等各方面都完全一致是非常困难的。为了在用户态弥补这一语义鸿沟,Wine引入了Wine Server这一服务进程。
如图1所示,Wine构造了Windows应用软件与Linux内核之间的适配层,主要包括了一个Wine服务进程(Wine Server)和一组Windows动态连接库。此外,Wine对用户界面API的模拟仍依赖于X Server。在运行Windows应用程序时,Wine需要与三个进程交互:
l Windows应用程序进程。该进程对Windows API函数调用均经由Wine所提供的各种动态连接库逐层向下转发,直至Linux内核系统调用。在Wine内部,这个进程需要通过套接字(socket)和管道(pipe)接口与Wine服务进程通信,以调用Wine服务进程提供的系统功能并接受服务进程的管理。Wine上运行的Windows应用程序进程是从Wine的作业载入程序wine迁移过来的,wine为该应用程序的运行建立起与Wine服务进程的连接之后载入目标程序,最后转入目标程序的入口函数(WinMain函数)开始运行。
l Wine服务进程。该进程提供Windows进程间通信与同步的手段、Windows进程与线程管理、注册表服务、各种Win32对象的管理等。Wine服务进程对进程、进程间通信等的管理与Linux内核所提供的相关服务并不冲突,因此只提供了Linux内核中不存在或者与Windows内核不兼容的部分。Wine服务进程实际是在为Windows应用程序提供远地过程调用(Remote Procedure Call,RPC)。可以说,Wine服务进程是整个Wine平台的核心,通过该服务进程,Wine在用户空间构造了一个虚拟的“Windows内核”。Wine服务进程的目的实际就是在用户态弥补Windows内核与其他操作系统内核的差异,尽管远程过程调用的方式带来了一定程度的性能下降,但也避免了修改Linux内核带来的潜在不稳定因素。
l X服务进程。该进程提供非Windows运行环境下的GUI服务,如图形显示输出以及键盘和鼠标输入等。
更多推荐
所有评论(0)