图1A示出了方便从操作系统中抽象出操作环境的示例计算机体系结构100。如图所示,计算机体系结构100包括操作系统101、操作环境抽象层102、操作环境103和应用程序111和112。操作系统101可包括用于与应用程序互操作的API 181。应用程序111和112可被配置成通过API 181来与操作系统互操作。因此,应用程序111和112可通过API 181来对操作系统101进行调用以请求操作系统服务。服务算法107可处理应用程序请求并响应于应用程序请求来提供操作系统服务。
操作系统101可包括用于与操作环境抽象层102互操作的API 182。API182可包括各种不同类型的API,诸如例如,初始化API、中断管理API、定时器API、传输API(例如,与管道、套接字、共享存储器等相关)、服务扩展API、多处理器API、线程本地存储API等。
操作环境抽象层102被配置成通过API 182来与操作系统101互操作。操作环境抽象层102还被配置成通过各种操作环境专用接口183来与操作环境103互操作。因此,操作环境抽象层102可通过操作环境专用接口183来访问操作环境103的资源。抽象算法106可用于确定将向操作系统101展示资源107的什么部分以及确定将如何向操作系统101展示资源107的各部分。操作环境抽象层102然后可根据抽象算法106的判定通过API 182来向操作系统101展示资源107的各部分。例如,操作环境102可向操作系统101展示资源部分107P。
抽象算法106是可调整的。操作环境抽象层103可基于资源107中所表示的操作环境103的功能来自动调整抽象算法106。例如,算法106可包括用于展示资源的多个不同抽象算法。基于资源107中所表示的功能,操作环境抽象层102可转换为使用适用于更有效地展示所表示的功能的抽象算法106的指定子集。
因此,可定制抽象算法106以便与操作环境103互操作。例如,操作系统103可展示完整服务以及可被组合成该完整服务的各个资源。因此,操作环境抽象层102可调整抽象算法106以便展示完全服务但未必展示各个资源。操作环境抽象层102可向操作系统101提供对各种不同服务的支持,包括页表、设备驱动程序、电源管理、存储器分配、网络通信传输、处理器对象(例如,中断管理)等。
服务算法104也是可调整的。操作系统101可基于资源部分107P中所表示的功能来自动调整服务算法104。例如,算法107可包括用于提供操作系统服务的多个不同服务算法。基于资源部分107P中所表示的功能,操作系统101可转换为使用适用于向作出请求的应用程序提供操作系统服务的服务算法107的指定子集。操作系统101可调整服务算法107以更有效地利用资源部分107P。
因此,可定制抽象算法107以与操作环境103的所展示的部分互操作。例如,资源部分107P可指示操作环境103可提供通信栈功能。因此,操作系统101可调整服务器算法107以便用所提供的通信栈功能而不是在操作系统101处创建通信栈功能。
图1B示出描绘对操作系统101的服务调用的执行流程的示例计算机体系结构100。操作系统101可提交并且操作环境抽象层102可处理的是各种不同类型的调用,包括同步调用、生产者-消费者调用以及异步调用。
例如,操作系统101可向操作环境抽象层102发出同步调用。同步调用包括诸如例如打开网络套接字或在控制台上显示文本串等操作。为了发起同步调用,进程111向包装函数112提交调用151,该包装函数112提供到底层操作环境抽象层调用的接口。包装函数112通过从进程111中抽象出操作环境抽象层102的底层机制来隐藏实现细节。例如,用于传递服务的包装器可独立于操作环境抽象层102展示的底层传输来提供基于网络传输的接口。该基于网络传输的接口在底层传输是共享存储器和事件时可被实现为环形缓冲区或者可以是用于命名管道传输的包装器。然而,包装函数从操作系统101中抽象出这些细节。
包装函数112向服务调用启用114提交调用152。由此,包装函数112启用包装操作环境抽象层102的源代码中所主存的操作环境抽象层函数的类中所定义的操作环境抽象层102的服务。该包装类可以为服务包装函数的启用定义特定属性。另外,该类可包括其他定义,诸如由该服务使用的错误代码和标志等。
服务调用启用114接收调用152。服务调用启用向启用服务118发出启用153。服务118可通过操作环境抽象层102的源代码中所主存的启用模型来执行。对服务118的调用可禁用中断并调用作为API 182的API结构中的函数指针来展示的服务118。
服务118响应于服务启用来返回适当的数据154(状态信息和结果),诸如例如,指向通信信道的指针等。
在某些实施例中,服务启用被分发给操作环境抽象层服务扩展。操作环境抽象层102可以加载动态链接库(“DLL”)形式的服务扩展,诸如例如,操作环境抽象层服务扩展121。操作环境抽象层102可将操作环境抽象层扩展121绑定到操作系统101。由此,操作系统可提交可利用的、在环境抽象层服务扩展121处服务的调用。例如,如调用153A和数据154A所示,服务122可被启用并返回适当的数据。因此,操作环境抽象层的功能可通过扩展来扩展而不必显著地修改操作环境抽象层。
服务启用114然后向包装函数122返回结果155(至少包括适当的数据154)。包装函数112处理结果155并向进程111返回结果156(也至少包括适当的数据154)。如果检测到错误情况,则包装函数112可引发对于进程111的异常。
生产者-消费者调用在操作环境抽象层102中的工作者线程(生产者)处产生,该线程使用中断通知机制来将操作完成通知给操作系统101(消费者)。这一服务的示例是在每一次键被按下并由操作系统101来处理时创建通知事件的键盘。
例如,工作者线程117可产生对中断线程116的调用157。工作者线程可用于API 182中的异步API或遵循生产者-消费者模型的服务。在任一种情况下,该工作者线程都可以是捕捉诸如例如I/O调用完成或键盘事件等系统事件的通知的循环。每一个工作者线程都可以与类似中断线程116的中断线程相关联。工作者线程创建关于事件的上下文信息并设置唤醒中断线程116的事件。以下代码示出了工作者线程循环的骨架示例:
while(1)
{
//等待下一事件
...
//创建中断上下文
...
//发信号通知中断线程并等待中断分派完成
::SignalObjectAndWait(
//发信号通知InterruptWorker
processor->ioscomm.waitHandle,
//等待中断分派
processor->ioscomm.completionHandle,
//没有超时
INFINITE,
//不适用
FALSE
);
}
中断线程116提交调用158以引发中断分派函数113。中断分派函数检索中断上下文,调用服务中断调用(例如,主存在操作系统101的包装类中)并清除该中断上下文。以下是键盘中断分派调用的示例:
if(interrupt==Kernel.ABSTRACTION_LAYERKeyboardInterrupt)
{
//检索中断上下文(按下键)
uint key=(uint)GetABSTRACTION_LAYERInterruptContext(interrupt);
//调用包装类
EnlightenedKeyboard.SetKeyAvailable(key);
ClearABSTRACTION_LAYERInterrupt(interrupt);
}
中断分派113可向进程111提交将引发唤醒正在等待异步或生产者-消费者操作的结果的包装函数(例如,包装函数112)的事件的调用159。
操作系统101也可向操作环境抽象层102提交异步调用。例如,调用151可以是异步调用。异步调用使用中断通知机制来处理,该中断通知机制用于在操作的执行已完成时通知操作系统101。异步调用的示例包括操作环境抽象层102的通信服务中所提供的读和写命名管道操作。生产者-消费者调用具有阻塞的可能性。由此,在某些实施例中,操作环境抽象层可将生产者-消费者调用作为异步操作来实现。
中断模型可用作用于通知异步操作的范例。图5示出了用于处理异步操作的中断模型中的示例上下文信息流500。操作系统包装函数(例如,类似于包装函数112)接收异步调用以执行操作。例如,操作系统包装函数512可接收请求执行操作532的异步操作调用531。响应于该异步调用,操作系统包装函数创建包括关于该特定请求的上下文信息的上下文结构。该上下文信息可包括对将在操作完成时发信号通知的事件的引用。例如,操作系统包装函数512可创建引用将在操作532完成时调用的事件的调用上下文521。
包装函数将该上下文传递给操作环境抽象层服务(例如,类似于服务118)。例如,系统包装函数512可将调用上下文521传递给抽象层服务518。该抽象层服务还可创建其自己的服务上下文,从而从包装函数中捕捉具有附加信息的上下文,这些附加信息诸如例如,操作类型或对于在完成时处理操作结果可能是有用的(或必需的)的其他信息。例如,抽象层服务518可创建服务上下文522,其指示操作532的操作类型和/或对应于操作532的其他结果处理信息。
当该操作完成时,工作者线程使用该服务上下文来后处理该操作的结果。例如,当操作532完成时,工作者线程117可使用服务上下文522来后处理操作532的结果。该工作者线程然后分派中断,同时将调用上下文和服务上下文传递给中断分派函数。例如,工作者线程117可将调用上下文521和服务上下文522传递给操作系统中断分派函数513。
中断分派函数用调用上下文来调用操作系统中断分派函数。例如,操作系统中断分派函数513可用调用上下文521来调用所有操作系统包装中断服务器函数519。操作系统中断分派函数可存储包装函数的上下文中的操作的结果和状态,并且然后引发唤醒操作系统线程的事件以指示该操作已完成。例如,操作系统包装中断服务器函数519可存储操作532的结果和状态并引发事件以便向发送异步操作调用531的线程指示操作532已完成。以下是通信服务分派代码的示例:
//分派已完成的异步操作
public static unsafe void Dispatch(void*context,ulong err)
{
AsyncOpContext*pContext=(AsyncOpContext*)context;
//将返回状态代码存储在本地上下文中
pContext->err=err;
//发信号通知客户机操作已完成
AutoResetEvent signal=SignalList[pContext->signal];
if(signal!=null)
signal.Set();
}
操作系统中断分派函数还可在抽象层处调用中断清除函数(例如,来自fClearInterrupt类)以解除分配服务上下文信息并执行任何其他清理操作。例如,操作系统中断分派函数513可调用抽象层中断清除模块520来解除分配服务上下文522并执行与操作532的完成相关的清理操作。以下是用于通信服务的中断清除代码的的示例:
void Win32ClearInterrupt(int interrupt)
{
Processor*processor=GetSEALProcessor();
if(interrupt==SEALIoscommInterrupt)
{
//自由动态分配的上下文
SEALSComFreeContext(processor->ioscomm.pContext);
//通知中断分派完成
::SetEvent(processor->ioscomm.completionHandle);
}
...
在以上代码中,存在中断上下文已被分派的事件通知。为了避免工作者线程(例如,517)和中断分派函数(例如,513)之间的竞争情况,该中断工作者线程可在该工作者线程循环结束时引发,并且代码在继续下一循环迭代之前等待分派操作已完成的信号。中断清除函数发信号通知该工作者线程继续。该工作者线程可类似于以上参考进程-消费者调用描述的骨架循环而循环。
通过使用各种启用方法,不同的操作环境抽象层可被配置成抽象出多个不同的操作环境以提供统一的功能集。统一的功能集可通过例如类似于抽象算法106的解决操作环境中的差异的抽象算法来提供。因此,利用统一的功能集的操作系统能够在该多个不同操作环境中的任一个中运行。
此外(例如,在初始化期间),抽象层可被配置成分析并变为完全知道其操作环境,包括标识其他抽象层的存在。由此,抽象层可被特别设计成利用对应的操作环境的特性。抽象层还可被配置成访问由其他标识的抽象层的操作环境提供的服务。
图2A-2C示出从操作系统中抽象出不同操作环境的示例计算机体系结构。如图2A所示,操作环境抽象层202(对应于硬件)利用硬件专用接口来抽象硬件203(例如,裸机)。在图2B中,操作环境抽象层222(对应于系统管理程序)利用系统管理程序专用接口284来抽象系统管理程序223。在图2C中,操作环境抽象层242(对应于主机操作系统)利用操作系统专用接口286来抽象主机操作系统243(例如,Windows NT、Windows CE、Linux)然而,操作环境抽象层202(对应于硬件)、操作环境抽象层222(对应于系统管理程序)和操作环境抽象层242(主机操作系统)中的每一个都支持经由API 282来与操作系统201进行通信。
因为操作环境的资源由对应的抽象层来访问并展示给操作系统201,所以操作系统201知道其执行环境的特性。因此,可针对操作系统201和正在运行的工作负载的要求来定制资源管理。由此,可调整抽象算法和服务算法(例如类似于服务器算法104的操作系统201中的算法)以便在操作环境中更有效地操作。例如,当操作系统201在系统管理程序223上运行时,可向操作系统201展示系统管理程序调度程序。因此,操作系统201的CPU调度程序可调整其策略以满足系统管理程序调度程序的要求。
设备驱动程序和操作系统服务可由操作系统201来本地实现或可被转发以便在操作环境(例如,在主机操作系统243)中执行。
在某些实施例中,操作系统201是操作环境。例如,主机操作系统243可以是操作系统201的实例。由此,操作系统201的一个实例可在操作系统201的另一个实例之上递归地运行。这种类型的递归可用于创建例如用于自主存和实现类似应用域的公共语言运行时环境(“CLR”)的隔离的执行环境。
操作系统及对应的抽象层能够以特权和非特权处理器模式(有时被称为执行环)的灵活组合来运行。图3A-3D示出跨不同处理器模式的从操作系统中抽象出不同操作环境的示例计算机体系结构。图3A描绘了主机操作系统环境343。在图3A的主机操作系统环境343中,操作系统301和操作环境抽象层342(对应于主机操作系统)两者都以用户模式311(环3)运行。
图3B也描绘了主机操作系统环境343。然而,在图3B的主机操作系统环境343中,操作系统301和操作环境抽象层342(对应于主机操作系统)两者都以内核模式312(环0)运行。图3B中所描绘的实施例准许在主机操作系统环境343中存在单独的执行环境。该单独的执行环境可用于例如主存设备驱动程序。操作系统301执行环境将驱动程序的执行与内核隔离开以允许优雅的设备驱动程序故障恢复。
图3C描绘了硬件环境303(例如,裸机)。在硬件环境303中,操作系统301以用户模式311(环3)运行而操作系统抽象层302(对应于硬件)以内核模式312(环0)运行。
图3D描绘了在系统管理程序323之上运行的来自图3A的主机操作系统环境343的实例。图3D还描绘了在操作环境抽象层322(对应于系统管理程序)之上、以内核模式312(环0)运行的操作系统301的实例。在图3D中,操作环境抽象层322(对应于系统管理程序)知道主机操作系统环境343的存在并且可利用由主机操作系统环境343提供的服务。操作系统301和操作环境抽象层342(对应于主机操作系统)的组合可担当对于由主机操作系统环境343提供的服务(例如,设备驱动程序)的代理。或者,操作系统301和操作环境抽象层322(对应于系统管理程序)的组合可直接与主机操作系统环境343的服务进行通信。
图4示出用于执行操作系统功能的示例方法400的流程图。方法400将参考计算机体系结构100中所描绘的组件和数据来描述。
方法400包括操作环境抽象层检测底层操作环境的可用操作环境资源的动作(动作401)。例如,操作环境抽象层103可检测操作环境103的资源107。方法400包括操作环境抽象层基于检测到的操作环境资源中所表示的功能来调整用于向作出请求的操作系统提供操作环境资源的抽象算法的动作(动作402)。例如,操作环境抽象层102可基于资源107中所表示的功能来调整抽象算法106。
方法400包括操作环境抽象层向操作系统展示所检测到的底层操作环境的操作环境资源以便向该操作系统标识所检测到的该底层操作环境的操作环境资源的动作(动作403)。例如,操作环境抽象层102可向操作系统101展示资源部分107P。方法400包括操作系统基于向该操作系统展示的、所检测到的操作环境资源中所表示的展示的功能来调整用于向作出请求的应用程序提供操作系统服务的服务算法的动作(动作404)。例如,操作系统101可基于资源部分107P中所表示的所展示的功能来调整服务算法107。
方法400包括操作系统接收对操作系统服务的应用程序请求的动作(动作405)。例如,操作系统101可从应用程序111或112接收对操作系统服务的请求。方法400包括操作系统根据经调整的服务算法和经调整的抽象算法,通过专用接口来与操作环境抽象层接口以实现对于作出请求的应用程序的操作系统服务的动作(406)。例如,操作系统101和操作环境抽象层102可根据经调整的服务算法104和经调整的抽象算法106,通过API 182来接口以实现对于应用程序111或112的操作系统服务。
本发明可具体化为其它具体形式而不背离其精神或本质特征。所述实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方式的含义和范围内的所有改变应被权利要求书的范围涵盖。