操作系统的制作方法

文档序号:6501654阅读:282来源:国知局
专利名称:操作系统的制作方法
技术领域
本发明涉及操作系统。更具体地,本发明涉及用于并行运行多个操作系统的系统、方法以及计算机程序。
背景技术
对于某些计算机程序,在规定的时间段内或者按照规定的次数执行程序中的步骤是很关键的。这种程序的示例有用于操作移动电话的控制程序,或者用于操作专用分局交换机(PBX)或蜂窝基站的控制程序。通常该程序必须在外部事件之后的特定时刻或者特定时间内以连贯的方式对外部事件或状态变化作出响应。这称作“实时”操作。
然而,对于许多其他程序,执行程序所花时间并非关键。这适用于大部分通用计算机程序,包括电子表格程序、字处理程序、工薪包以及通用报告或分析程序。另一方面,在大多数情况下,尽管这种程序所用的精确时间不关键,但是用户希望尽可能地更快执行。
应用程序通过操作系统与它们在其上运行的计算机交互。通过利用操作系统的应用编程接口(API),可按照便携方式来编写应用程序,使其可在具有不同硬件资源的不同计算机上执行。另外,诸如Linux或Windows的公共操作系统提供多任务;换言之,这些操作系统允许几个程序并行运行。为此,这些操作系统提供调度;换言之,它们根据调度算法为各个程序分配时间,从而在不同的程序之间共享计算机资源的使用。这种操作系统被广泛采用,但是它们通常不能用于运行实时应用,因此对于很多控制或通信任务都不适合。
因此,针对这种任务,已经开发了实时操作系统;一个示例是ChorusOS(也称作Chorus)及其衍生物。作为开放源码软件,Chorus可以从http//www.experimentalstuff.com/Technologies/ChorusOS/index.html获得,Jaluna可以在http//www.jaluna.com/获得。
在“ChorusOS Features and Architecture overview”,Francois Armand,Sun Technical Report(2001年8月,第222页)(可以从http//www.jaluna.com/developer/papers/COSDESPERF.pdf获得)中,对其进行了描述。
这些操作系统也可以用于运行其他类型的程序。然而,可以理解,用户希望能够运行为诸如Windows或Linux的通用操作系统编写的大量“传统”程序,而不必为在实时操作系统中运行而重写这些程序。
可以提供“双引导”系统,从而允许用户运行其中一个操作系统或另一个操作系统,但是存在很多这样的情况,其中希望在运行实时程序的同时能够运行“传统”程序。例如,电信网络基础设施设备、第三代移动电话和其他先进电话、以及先进电子游戏设备,可能既需要实时应用(例如,游戏播放图形),也需要非实时应用(游戏下载)。
在US 5903752和US 5721922中,尝试通过在非实时操作系统(例如Windows)的中断处理环境中提供实时多任务内核,来将实时环境并入非实时操作系统中。
一种已广泛应用的方案是“仿真”。通常,编写仿真程序以在实时操作系统下运行,该仿真程序解释为通用操作系统编写的程序的各个指令,并在实时操作系统下执行对应的一系列指令。然而,由于总是由很多指令来取代一个指令,所以仿真使计算机负担更重,并导致更慢的性能。基于提供虚拟机(例如,JavaTM虚拟机)的方法存在类似的问题。虚拟机实现的示例有EP 1059582、US 5499379、以及US 4764864。
US 5995745(Yodaiken)中描述了另一种类似的技术。Yodaiken描述了这样一种系统,即,其中多任务实时操作系统运行作为其任务之一的一个通用操作系统,必要时将其抢先以执行实时任务。
另一个方案是如在例如EP 0360135和1990年9月的ELECTRONICS中第62页的论文“Merging real-time processing and UNIX V”(Gosch)中所描述的,将实时操作系统运行为通用操作系统的一个模块。在这种情况下,按照希望与通用操作系统相关的硬件中断不应抢先实时操作系统的方式来选择性地屏蔽硬件中断。
另一个方案是http//opersys.com/ftp/pub/Adeos/adeos.pdf处的白皮书中描述的ADEOS(操作系统的自适应域环境)方案。
ADEOS提供了超微内核,超微内核在其他事情中,将用于运行多个操作系统等,尽管看起来该超微内核仅是利用Linux来实现的。对ADEOS的一个建议使用是允许ADEOS将中断分布到RTAI(Linux的实时应用接口),对此参见http//www.aero.polimi.it/~rtai/applications/。
EP 1054332描述了一种其中“切换单元”(并未为全面理解而对其进行充分地详述)运行实时操作系统和通用操作系统的系统。由公共中断处理器来处理硬件中断,而在一些实施例中,由实时操作系统来处理硬件中断,该实时操作系统然后生成较低优先级的软件中断,这些软件中断由次级操作系统中的例程来进行处理。

发明内容
本发明的一个目的是提供一种用于即使在出于不同目的来设计多个操作系统的情况下也能同时运行这些操作系统的改进的系统、方法以及计算机程序。特别地,本发明旨在允许所述多个操作系统中的一个操作系统(例如,实时操作系统)不受干扰地执行,而另一个操作系统(例如,通用操作系统)利用计算机的剩余资源尽可能好地执行。
因此,在一个方面中,本发明提供了一种系统,在该系统中多个操作系统被略微修改并设置有在它们之间进行调度的公共程序,在该系统中多个操作系统中的一个操作系统(“主”或“关键”操作系统)优先于另一个操作系统(“次级”或非关键操作系统)。优选地,本发明优先为关键操作系统分配硬件,并拒绝对该关键操作系统的访问发生干扰的一个或更多个次级操作系统访问。优选地,本发明利用关键操作系统驱动器来访问共享资源,即使次级操作系统请求进行访问。然而,决不是如US 5995745中一样,关键操作系统“运行”次级操作系统;各系统都忽略与其一起运行的其他系统,且仅与代理(broker)对关键操作系统的驱动器的访问的公共程序(对应于现有技术的超微内核)进行通信。
优选地,修改次级操作系统,以使得它们不能屏蔽中断,并修改它们的中断服务例程以使它们响应于表示发生中断的消息。公共程序通过将全部硬件异常传递给主操作系统的中断服务例程来处理所述全部硬件异常,并且在一个次级操作系统希望硬件中断时,生成中断消息或通知。在下一次由公共程序来调度该次级操作系统时,将消息或通知传递给它,而公共程序调用其中断服务例程来服务该中断。
因此,次级操作系统在发生中断时不能以任何方式抢先主操作系统(或者,一般来说,更高重要性的次级操作系统),因为全部中断最初都由主操作系统来处理,并仅在主操作系统已经结束执行之后向次级操作系统通知其是目标,从而调度该次级操作系统。
由此推迟处理这种中断,直到在主操作系统中没有关键任务发生为止。然而,当最终执行这些中断时,次级操作系统的例程可基本按照未修改的方式来进行操作,使得该行为是次级操作系统所期望的(除了延迟)。
在我们先前提交的PCT申请PCT/EP04/00371中描述了这样一种系统,在此通过引用将其并入。
本发明涉及在复杂指令集计算机(CISC)(如基于Intel IA-32架构的复杂指令集计算机)上的实现。CISC处理器具有多个寄存器,需要保存这些寄存器的状态并在操作系统之间切换时获取它们。CISC处理器可以具有多个存储器寻址模式,使得不同的操作系统可以在不同的模式下运行应用,并且CISC处理器可以具有复杂数据结构,需要保存并获取这些数据结构的状态。这些因素使得实现通过其可并行且按稳定方式执行多个操作系统的系统并不麻烦。
为了理解公知的Intel IA-32架构背景,通过引用并入以下内容Intel Architecture Software Developer’s Manual,卷1BasicArchitecture(序号245470-011)Intel Architecture Software Developer’s Manual,卷2Instruction SetReference(序号245471-011)
Intel Architecture Software Developer’s Manual,卷3SystemProgramming Guide(序号245472-011)所有这些都可从Intel Corporation,PO Box 7641,Mt Prospect IL60056-7641免费获得,并可从http//www.intel.com下载。
非限制地,此处公开的一些创新性特征如下A-修改操作系统以通过调用利用硬件资源调度程序的方法来取代处理器指令;并且是特别地而非排它地;B-允许替换用于读取或写入诸如向量表(如GDT表和IDT表)的存储器寻址数据结构的指令;C-复制原始存储器寻址数据结构(例如GDT表和IDT表)来为诸如Linux的操作系统(由方法调用,而非通过所取代的处理器调用访问)提供代理数据结构,使得原始存储器寻址数据结构由硬件资源调度程序访问;D-在硬件资源调度程序所用的数据结构内设置“公共”或“开放”部分以及“专用”或“隐藏”部分;E-在操作系统之间,以及(正如已知)在单个操作系统上的多个应用之间浮点单元(FPU)的“懒惰”(lazy)传输;F-使用任务门(task gate)来明确地在多个操作系统之间进行切换,以及G-使用一些特定例程而非任务门,来无需改变存储器状况(context)地在主操作系统与硬件资源调度程序之间快速地进行切换(从而无需保存全部寄存器,使得切换更快);H-防止次级操作系统屏蔽中断,除非是优选地;I-在任务切换操作(具有非常短的持续时间)期间和/或;J-在硬件资源调度程序操作(具有非常长的持续时间)(如RS-232通信或字符输出)期间;K-采用两个独立的栈结构以进行状况切换;一个用于陷入(trap),一个用于异步任务;L-采用主操作系统的部分监管状况来运行硬件资源调度程序。
根据以下说明、权利要求以及附图,其他方面、实施例以及优选特征,连同对应的优点,将变得显见。


下面将参照附图,仅以示例的形式来描述本发明的实施例,在附图中图1是示出本发明可在其上执行的计算机系统的组件的框图;图2a是示出现有技术中的软件设置的图;而图2b是示出根据本实施例的软件设置的对应图;图3是示出在为图1的计算机创建图2b的软件时的多个阶段的流程图;图4示出了图2b的硬件资源调度程序形成部的组件;图5示出了在引导和初始化序列中使用的程序;图6示出了在引导或初始化过程中使用的系统存储器映像;图7示出了从主操作系统到次级操作系统的切换;图8示出了从次级操作系统到主操作系统的切换;图9a示出了根据本发明在不同操作系统上运行的多个应用程序之间的通信;图9b示出了根据本发明在不同计算机上的不同操作系统上运行的多个应用程序之间的通信;图10示出了主、次级以及超微内核虚拟地址空间的示例;图11示出了在时间上如何切换存储器状况;图12示出了超微内核状况的可见部分;图13示出了超微内核状况的隐藏部分;图14示出了在任务切换之前如何对初始TSS进行初始化;图15示出了超微内核TSS的非零域;图16示出了TSS栈的典型状态;图17示出了如何在Intel架构中的存储器寻址中采用分段和分页;以及图18示出了在Intel架构中的系统级寄存器和数据结构。
具体实施例方式
引言系统硬件系统适用的计算机系统100包括中央处理单元(CPU)102,例如可从Intel公司获得的Pentium 4TMCPU或者可从Motorola获得的PowerPC CPU(实施例已经在这两者上得到了实现),该中央处理单元102经由系统总线104(包括控制总线、数据总线以及地址总线)耦合至只读存储器(ROM)芯片106;一排或多排随机存取存储器(RAM)芯片(108);盘控制器装置110(例如,IDE或SCSI控制器,其连接至软盘驱动器、硬盘驱动器以及诸如DVD驱动器的附加可移动介质驱动器);一个或更多个输入/输出端口(112)(例如,一个或更多个USB端口控制器,以及/或者用于连接到打印机等的并口连接器);扩展总线114,用于将总线连接至外部或内部外围设备(例如PCI总线);以及其他系统芯片116(例如,图形和声音设备)。这类计算机的示例为个人计算机(PC)和工作站。然而,此处还公开了本发明在诸如大型机、控制系统中的嵌入式微机以及PDA(在这种情况下,可省略诸如盘驱动器控制器的一些指出的设备)的其他计算设备中的应用。
对软件的管理参照图2a,使用时,图1的计算机100运行驻留程序,这些驻留程序包括操作系统内核202(提供允许CPU访问图1中所示的其他设备的输出例程)、操作系统用户界面或表示层204(例如X Windows)、中间件层206(例如提供诸如TCP/IP栈的网络连接软件和协议),以及通过调用形成操作系统内核202的API例程来运行的应用程序208a、208b。
操作系统内核具有多个任务,具体地具有■调度(即,在正在运行的多个不同应用程序之间共享CPU和相关资源);■存储器管理(即,为每个任务分配存储器,并且必要时将存储器中的数据和程序交换增加到盘驱动器中);■提供文件系统;■提供对设备的访问(通常,通过驱动器);■中断处理;■提供应用编程接口,使得应用能够与系统资源和用户进行交互。
对于Unix,内核可为所谓的“单内核”,在这种情况下设备驱动器形成内核自身的一部分。另选地,对于Chorus,内核可为“微内核”,在这种情况下,设备驱动器独立于内核。
然后,在使用中,当启动计算机100时,ROM 106中存储的自举(bootstrap)程序访问盘控制器110,来将操作系统的文件处理部分从盘上的永久存储中读入RAM 108中,然后将操作系统的剩余部分加载到RAM 108的区域中。操作系统然后经由盘控制器110从盘驱动器中读取任意应用,在RAM 108中为每一个应用分配空间,并且将每个应用存储在其所分配的存储器空间中。
在应用的操作期间,操作系统的调度器部分在不同应用之间划分对CPU的使用,允许每个应用根据调度策略共享处理器的时间。还通过“交换出”不常用的应用或数据(即,将它们从RAM 108移除以释放空间,并将它们存储到盘上)来管理对存储器资源的使用。
最后,从应用调用构成应用编程接口(API)的多个例程,来执行诸如输入和输出的功能,并且操作系统的中断处理例程对中断和事件进行响应。
优选实施例的原理概要在优选实施例中,略微重写要在计算机100上使用的各操作系统201、202,并且创建新的低层程序400(这里称作“硬件资源调度程序”,尽管其并非操作系统的内核,但是有时被称作“超微内核”)。硬件资源调度程序400专用于特定类型的CPU 102,因为其与处理器交互。出于显见的原因,这些被修改的操作系统201、202的版本还是专用于硬件的操作系统。
硬件资源调度程序400本身不是操作系统。它根本不与应用程序交互,并且具有极为有限的功能性。它既不是虚拟机也不是仿真器;它需要修改操作系统以进行协作,即使它将大部分处理留给操作系统本身,在处理器上运行它们的本机代码。
硬件资源调度程序400执行以下基本功能■载入并启动多个操作系统中的每一个;■将存储器和其他系统资源分配给每个操作系统;■调度不同操作系统的操作(即,在它们之间划分CPU时间,并管理它们之间的切换);■提供非直接访问这些需要由操作系统共享的系统设备的“虚拟化设备”的方法(对设备进行“虚拟化”);■提供操作系统之间的通信连接,以允许在不同操作系统上运行的应用彼此进行通信。
实施例没有同等处理多个操作系统。相反,将一个操作系统选为“关键”操作系统(这将为实时操作系统),而将另一个或各其他操作系统当作“非关键”或“次级”操作系统(这将为诸如Linux的所述或各通用操作系统)。
当设计硬件资源调度程序时,令其设置有列出可用系统资源(即,设备和存储器)的数据结构(例如,表),以使得能够静态地把尽可能多的系统设备专门地分配给一个或其他操作系统。
例如,可将并行打印机端口静态地分配给通用操作系统202,通用操作系统202经常运行需要生成打印机输出的应用。另一方面,可将ISDN数字线适配器端口永久地分配给实时操作系统201用以进行通信。这种尽可能地对设备的静态分配意味着,各操作系统可利用其已有的驱动器来静态地访问所分配的设备,而无需调用硬件资源调度程序。因此,在访问这种设备时在执行速度上没有如其用作虚拟机或仿真器的情况下的损失。
对于必须共享的系统设备,硬件资源调度程序虚拟化非关键操作系统对设备的使用,并利用配备有关键操作系统的驱动器来执行访问。同样,对于中断处理,中断把中断处理例程传递到关键操作系统,该中断处理例程或者处理中断(如果中断是针对关键操作系统的)或者通过硬件资源调度程序将中断交回来,以转交到非关键操作系统(如果非关键操作系统是中断的目的地的话)。
引导时,首先载入硬件资源调度程序,然后按照预定顺序载入各操作系统,以关键操作系统开始,接着依次是所述或各次级操作系统。从表中为关键操作系统分配其所需的资源,并且关键操作系统具有固定的存储器空间用来在其中进行操作。然后从可用剩余资源中依次为各次级操作系统分配其所需的资源和存储器空间。
因此,根据实施例,通过为各操作系统分配其自己的存储器空间,并通过为操作系统专门提供对设备的静态分配,来尽可能在物理上分离操作系统所使用的资源;仅共享对其而言共享关键的设备。
操作中,硬件资源调度程序调度器允许关键操作系统进行操作直到其已结束了任务为止,然后顺次将控制依次交回给各非关键操作系统,直到下一中断或事件发生为止。
实施例由此允许多操作系统环境,其中关键操作系统的操作实际上不变(因为关键操作系统使用其原驱动器,并首先访问任何中断和事件处理)。次级操作系统在剩余处理器时间内能够高效地工作,这是因为在大多数情况下,它们将利用它们自己的本机驱动器,并将专门地访问多个系统设备。最后,硬件资源调度程序本身可以是小程序,因为其仅处理有限的功能,使得可以节约系统资源。
优选实施例还有利于创建和维护,因为其仅涉及对标准商用操作系统(其已经适用于具体计算机100)的有限改变。另外,由于将对操作系统的改变限制到诸如中断处理的架构特定文件处理事件,以及初始化时的结构(它们与特定类型的计算机100交互,并且不可能如其余操作系统一样频繁变化),所以这可能很少有利于或者不利于修改同一操作系统的新版本,以按照多操作系统方式进行工作。
优选实施例的具体描述在该实施例中,计算机100为Intel 386系列处理器(例如,Pentium处理器)(步骤302)。关键操作系统201为C5操作系统(Jaluna-1的实时微内核,即第五代ChorusOS系统的开放源码版,可获得开放源码,可从http//www.jaluna.com免费下载)。
在步骤306中,将ChousOS操作系统内核201修改为按照多操作系统模式运行,这是按照与移植到新平台相同的方式来处理的(即,写入新的板级支持包(Board Support Package)来允许在具有同一CPU而具有不同系统设备的新计算机上执行)。修改引导和初始化序列来允许实时操作系统在其分配存储器空间中由硬件资源调度程序来启动,而不是自启动。修改初始化序列的硬件探查阶段,以防止关键操作系统访问指配给其他次级系统的硬件资源。它从硬件资源调度程序中读取静态硬件分配表来检测其可用设备。
向关键操作系统加入了陷入调用2012,以检测状态并相应地请求某些动作。这里陷入调用是指使得处理器保存当前状况(例如,寄存器状态)并加载新的状况的调用。因此,当采用虚拟存储器寻址时,将改变地址指针。例如,当实时操作系统201到达终点(并停止请求处理器资源)时,可将控制交回给硬件资源调度程序,发出“空闲”陷入调用,来启动次级操作系统。很多处理器具有“中止”指令。在一些情况下,仅监管级代码(例如,操作系统,而非应用)可以包括这种“中止”指令。在该实施例中,重写所有的操作系统来移除“中止”指令,并以“空闲”例程(例如,执行线程)来取代这些“中止”指令,“空闲”例程在被调用时发出“空闲”陷入调用。
板级支持包的一些驱动器具体适于辅助硬件资源调度程序来为次级操作系统虚拟化共享设备。
加入附加“虚拟”驱动器2014,它们对于操作系统而言,表现为提供对输入/输出(I/O)总线的访问,这允许向总线重写数据。实际上,虚拟总线驱动器2014采用存储器作为通信介质;它导出一些专用存储器(针对输入数据)并导入由其他系统导出的存储器(针对输出数据)。按照这种方式,操作系统201(或在操作系统上运行的应用)可向另一操作系统(或在其上运行的应用)传递数据,就像是它们是在通过真实I/O总线连接的单独机器上运行的两个操作系统。
将次级操作系统202选择(步骤308)为具有内核版本2.4.18的Linux(步骤308)。
在步骤310,修改次级操作系统内核202以允许其工作在多操作系统环境中,这被当作新的硬件架构。与在步骤306中一样,修改引导和初始化序列以允许次级操作系统由硬件资源调度程序来启动,并防止其访问指配给其他系统的硬件资源,如在硬件资源调度程序表中所指定的。与在步骤306中一样,加入陷入调用2022,来将控制转给硬件资源调度程序。
以新的驱动器2028来取代用于共享系统设备的本机驱动器,该新的驱动器2028处理已由硬件资源调度程序虚拟化的设备(中断控制器、I/O总线桥、系统定时器以及实时时钟)。这些驱动器执行对硬件资源调度程序的虚拟设备处理器416的调用,以在计算机100的相应设备上执行某些操作。硬件资源调度程序的每个这种虚拟设备处理器416都与关键操作系统中的“对等”驱动器例程(其被设置为直接与系统设备交互)配对。由此,可将对虚拟设备处理器的调用中转到关键系统中针对该经虚拟化的设备的对等驱动器,以进行实际设备访问。和在步骤306中一样,设置针对虚拟I/O总线的读取和写入驱动器2024,以允许进行操作系统间通信。
修改次级操作系统的中断服务例程,以提供多个虚拟中断服务例程2026,每一个虚拟中断服务例程2026都(以硬件资源调度程序的中断处理器例程412所发出的调用的形式)对相应的虚拟中断进行响应,而不对实际中断或事件进行响应。还修改次级操作系统的例程(包括中断服务例程),以去除对硬件中断的屏蔽(至少在除关键操作以外的全部操作中)。这样,次级操作系统202等由此可被关键操作系统201抢先;换言之,次级操作系统对虚拟中断的响应本身可由针对关键操作系统201的实际中断来中断。这通常包括■屏蔽/不屏蔽事件(处理器级的中断);■保存/恢复事件屏蔽状态;
■识别中断源(中断控制器设备);■屏蔽/不屏蔽源级处的中断(中断控制器设备)。
加入新的虚拟设备驱动器2028,用于访问所共享的硬件设备(I/O总线桥、系统控制台、系统定时器以及实时时钟)。这些驱动器执行对硬件资源调度程序的虚拟设备处理器416的调用,以向计算机100的相应设备写入数据,或从计算机100的相应设备中读取数据。
为了实现此,在本实施例中通过将新的虚拟硬件资源调度程序架构子树(针对I-386和PowerPC变量的nk-i386和nk-ppc)与少量修改文件相加,来修改Linux内核207。按照已有形式再次使用未改变文件。保持但不使用原始子树。
在步骤312,写入硬件资源调度程序400。硬件资源调度程序包括提供用于如下功能的例程的代码(如图4所示)■引导和初始化本身(402);■存储表(403),该表存储硬件资源(诸如端口的设备)的列表,和表示将各资源唯一地分配给哪个操作系统的分配条目;■引导并初始化完成硬件资源调度程序分配表的关键操作系统(404);■引导并初始化次级操作系统(406);■在操作系统之间进行切换(408);■在操作系统之间进行调度(410);■处理中断(利用实时操作系统中断服务例程,并在需要时将数据提供至次级操作系统的虚拟中断服务例程)(412);■处理来自各操作系统的陷入调用(414);■处理从次级操作系统对共享设备的访问(416);■处理虚拟I/O总线上的操作系统间通信(418)。
在其他实施例(如下所述)中,还可以提供系统调试构架。
操作系统切换器408为了从一个操作系统切换到另一个操作系统,操作系统切换器408被设置用来保存当前正在执行的操作系统的“状况”——一组状态变量的当前值(例如寄存器值);恢复所存储的另一操作系统的状况;并且调用该另一操作系统来从停止处重新开始执行。当处理器使用存储器的分段以及虚拟或间接寻址技术时,由此交换将指针存储到当前存储器空间中的寄存器或数据结构。例如,各操作系统在不同的这种存储器空间(由包括针对这些空间的指针值在内的状况所限定)中运行。
具体地,该切换器提供■在当前变为空闲时,从当前运行的操作系统到下一调度的操作系统的显式切换(例如,陷入调用);和■当硬件中断发生时,从次级操作系统到关键操作系统的隐式切换。
如下所述,切换可发生在陷入调用或者实际或虚拟中断时。
调度器410调度器410通过在现有另一操作系统之后选择下一次要切换到哪个次级操作系统(如果存在多于一个次级操作系统的话),来为各操作系统分配可用处理时间中的一部分。在本实施例中,基于固定优先级调度来选择每一个。这里还设想了允许基于时间共享或保证最小处理时间百分比的规定的其他实施例。然而在各种情况下,仅当处于空闲状态时抢先关键操作系统。
在其他实施例中,关键操作系统在可能被抢先时可以显式通知调度器410,来允许全部次级操作系统中的一些访问CPU以执行具有更高优先级的任务,然后执行仍在关键系统中运行的任务。由此,在一个示例中,不能抢先关键操作系统的中断服务例程,从而关键操作系统能够始终对外部事件或来自实时时钟的定时信号做出响应,来保持实时操作。
处理虚拟化的处理器异常将硬件资源调度程序设置为提供用于如下处理处理器异常(例如,CPU中断或协处理器中断)的机制■首先,通过关键操作系统截获处理器异常;■其次,将对应的虚拟异常递送到一个或更多个次级操作系统;存储该数据,并当调度器接着调用该次级操作系统时,调用次级操作系统中的对应虚拟中断服务例程2026;■第三,屏蔽或不屏蔽来自次级操作系统内的任何未决虚拟异常。虚拟化异常通常用于两个不同目的●首先,将硬件设备中断(它们被作为异步处理器异常进行传递)转交到次级操作系统;●其次,实现操作系统间交叉中断——即,由一个系统对另一个中断产生的中断(它们被作为同步异常进行传递)。
陷入调用处理器414根据以下说明,陷入调用处理器的操作将变得显见。其主要目的是当第一个次级操作系统中止(并且因此不需要CPU资源)时允许调度器和切换器改变到另一操作系统。另外的作用是如参照后面的实施例所讨论的调用硬件资源调度程序服务,如用于调试中的系统控制台。
虚拟化设备416如上所述,各操作系统为各共享设备(例如,中断控制器、总线桥、系统定时器、实时时钟)提供一设备驱动器,以形成用于该设备的一组对等级驱动器。实时操作系统提供用来实际访问设备的驱动器,而其他的则提供虚拟设备驱动器。
硬件资源调度程序的共享设备处理器416为各设备提供所存储的数据结构,用于由该设备的全部对等设备驱动器来访问。当要访问或已访问过设备时,设备驱动器以访问详情来更新对应数据结构中存储的数据。对等驱动器采用交叉中断(如上所述)来发送一个事件以向其他对等驱动器通知该数据结构已被更新。
用来访问中断控制器设备的驱动器采用上面讨论的虚拟化异常机制来如下处理硬件中断■关键操作系统设备驱动器处理硬件中断,并将它们作为虚拟化异常转交到次级对等驱动器;■次级操作系统通过利用屏蔽和不屏蔽上述例程的虚拟化异常来使能和禁止中断。
仅当连接到I/O总线及其桥的设备不全被分配给同一操作系统时,I/O总线及其桥才不得不被共享。因此,在分配设备时,在可能的程度上,将连接至同一I/O总线的设备分配给同一操作系统。当必需共享时,资源分配表404存储表示总线上的资源分配的描述符数据(地址空间、中断线和I/O端口),来表示哪个操作系统拥有哪些资源。
实施例的实现最后,在步骤314,将硬件资源调度程序和操作系统的代码编译为可发布的二进制计算机程序产品,以提供给计算机100。
可以根据本发明一方面提供的产品是开发环境产品,包括计算机程序,该计算机程序使得用户能够选择要使用的不同操作系统,为各操作系统构建并选择不同的应用,将应用和操作系统嵌入可发布产品中,并且提供对操作系统的引导以及推出应用的可执行二进制码。这基于并类似于可从www.jaluna.com获得的C5开发环境。
实施例在引导和初始化期间的操作参照图5,如下执行根据该实施例的引导和初始化处理。
当初始供电时执行ROM 106中存储的自举程序(“trampoline”)4022,该自举程序4022启动将硬件资源调度程序400的剩余部分安装到存储器中并启动它的程序4024,从而将描述系统映像配置的数据结构(如下所述)作为实际参数(argument)来传递。
硬件资源调度程序初始化可用于系统控制台的串行线。然后硬件资源调度程序从关键操作系统开始,依次为各操作系统分配存储器空间(操作系统环境)。硬件资源调度程序因此充当第二级系统内核引导加载器。
然后各操作系统内核经过其自身的初始化阶段,在资源分配表404中的剩余资源中选择该操作系统专用的资源,并且启动其初始服务和应用。
图6示出了形成系统映像的存储器地址分配的示例。当编译硬件资源调度程序和操作系统时,分配存储器内的位置。存储器中的这些位置的集合限定了图6中示出的系统映像。系统映像包括第一排存储器602,硬件资源调度程序位于其中;第二排存储器604,实时操作系统位于其中;第三排存储器606,次级操作系统位于其中;以及,在本实施例中的第四排存储器608,包含次级操作系统(Linux)的根文件系统的RAM盘位于其中。
将该系统映像存储在永久存储部(例如,诸如移动电话或PBX的典型实时设备的只读存储器)中。剩余排的存储器可用来分配给各操作系统作为其环境,在该环境中各操作系统可以加载并运行应用。
为操作系统状况分配存储器各操作系统在被引导的同时分配一补充存储器区,以满足其自身配置所需的总大小。一旦将多排存储器分配给了操作系统,就利用操作系统本身的物理存储器管理方案来对其进行管理。该操作系统忽略所有其他存储器。
虚拟存储器分配为各操作系统分配单独的虚拟存储器空间,以确保操作系统不会相互干扰或干扰硬件资源调度程序。为各操作系统的用户地址空间(即,范围)和监管地址空间(即,范围)中的每一个分配不同的存储器管理单元(MMU)状况标识符(ID),用户地址空间和监管地址空间使得可以区分具有交叠地址的不同虚拟存储器空间。MMU状况ID在被编译(图3中的步骤314)时被分配给各操作系统。
该解决方案避免了当硬件资源调度程序在不同操作系统之间切换时,对刷新转换缓冲器(TLB)的需要(这需要花费额外的时间)。相反,通过存储当前作用的操作系统的MMU状况ID并再调用先前存储的经切换的两个操作系统的MMU状况ID,来实现在不同操作系统之间的切换。
分配输入/输出设备如上所示,分配表404表示哪些设备被唯一地分配给各操作系统。另外,表404表示哪些输入/输出资源(直接存储器存取(DMA)设备、输入/输出端口、中断等)被专门分配给这种设备,由此允许无任何冲突地直接使用这些资源。通常,很多设备是重复的,所以按照这种方式可以从根本上减少潜在的冲突。
该分布基于操作系统配置方案(例如,在C5的情况下,在设备树中指定的设备)。在引导时并且按照引导顺序将它们分配给操作系统,使得关键操作系统具有对表404中的可用设备的第一选择,而次级操作系统依次接收到它们在剩余设备中的分配。当初始化各操作系统时,各操作系统检测这些设备的存在,并且不与硬件资源调度程序交互而对它们使用本机驱动器。
次级操作系统的“热”重新引导根据本实施例,可以在其他操作系统继续运行的同时重新引导次级操作系统(例如,由于崩溃)。由于系统资源的分离,次级操作系统中的崩溃不会干扰关键操作系统(或其他次级操作系统)的正在进行的操作,并且该次级操作系统的重新引导也不会干扰。
在实施例中,在关键操作系统内,对硬件资源调度程序的系统“停止”和“启动”陷入调用辅助关闭和重启次级操作系统。另外,硬件资源调度程序在引导时将原始系统映像的副本保存在分配给硬件资源调度程序的存储器内的永久存储器中。作为示例,如下管理该实施例中的热重启在初始启动时,硬件资源调度程序保存次级操作系统存储器映像的副本。
关键操作系统包括软件监视驱动器例程,该软件监视驱动器例程用于周期地监控次级操作系统的功能(例如,通过设置超时并等待由次级操作系统中运行的对等驱动器触发的事件,来检查它们的连续操作)。
如果关键操作系统检测到次级操作系统已出现故障或者已停止,则其触发对硬件资源调度程序的(次级操作系统的)“停止”陷入调用,然后是“启动”陷入调用。
硬件资源调度程序然后恢复所保存的次级操作系统映像的副本,并从存储器重新引导它以进行重启。在测试实施例时发现,从锁住起可在几秒中内重新引导Linux次级操作系统。
在其他方面,热重启建立在可在Chorus操作系统中获得的基础上,例如如下所描述的“Fast Error Recovery in CHORUS/OS.The Hot-Restart Technology”,Abrossimov,F.Hermann,J.C.Hugly等,Chorus Systems Inc.TechnicalReport,1996年8月,第14页,其可从如下网址获得http//www.jaluna.com/developer/papers/CSI-TR-96-34.pdf运行时操作下面将更详细地描述该实施例在安装和引导之后的操作。
在被引导和初始化之后,实时操作系统运行一个或更多个应用207(例如,UDP/IP栈,UDP/IP表示通用数据报协议/因特网协议),并且次级操作系统运行几个应用208a、208b(例如,字处理器和电子表格)。实时操作系统微内核201和次级操作系统内核202通过硬件资源调度程序接口与硬件资源调度程序通信,该硬件资源调度程序接口包括●数据结构,表示操作系统状况(即,需要保存并恢复以切换到该操作系统的状态变量组)和硬件库(hardware repository);●在操作系统环境中执行的功能组;以及●在硬件资源调度程序环境中执行的陷入调用例程组。
如果任一操作系统都不需要处理器时间(例如,两者都已到达“等待”状态),则硬件资源调度程序400切换到关键操作系统的空闲线程,在该空闲线程中其等待中断或事件。因此,可由关键操作系统的服务例程来立即处理中断,而无需首先切换到关键操作系统。
在某点处,将发生中断或事件。例如,可在数据端口处接收到信息包,引起中断,以允许其由执行UDP/IP栈的实时操作系统来处理。另选地,用户可以操纵键盘或鼠标,引起中断,以运行次级操作系统202的GUI来与字处理应用208交互。另选地,系统时钟可以指示已经经过了预定时间,并且应开始再次执行应用,或者应当执行操作系统功能。
如下所述,服务于例程的关键操作系统随后服务于中断。
中断和事件处理如果不在关键操作系统中,则硬件资源调度程序中断处理器412调用操作系统切换器408以切换至关键操作系统,然后中断处理器例程412调用关键操作系统201中的中断服务例程(ISR)。如果中断是针对关键操作系统的,则由于其来自被唯一分配给关键操作系统的设备,或者由于其来自共享设备并且具有特定的预定值,所以关键操作系统ISR采取处理中断所必需的动作。如果中断不是针对关键操作系统的,则将控制交回给硬件资源调度程序。
关键操作系统到次级操作系统的切换参照图7,对于该示例,系统正执行在关键操作系统201上运行的应用207a的线程702。
如果发生中断,则关键操作系统中断服务例程704执行中断服务。结束时,控制转回到线程702以及关键操作系统201的调度器所执行的任意其他线程。当完成对全部线程的处理时,关键操作系统结束执行,它调度其“空闲”线程。从而,关键操作系统中的“空闲”陷入例程发出对硬件资源调度程序400的“空闲”陷入调用。硬件资源调度程序然后执行进行如下操作的例程●如果中断处理器412当前具有某些存储的虚拟中断,则由中断处理器412将这些虚拟中断转交到次级操作系统。
●硬件资源调度程序操作系统调度器410选择次级操作系统202来执行。OS切换器408接着将当前状况(通常为,处理器MMU和状态寄存器、指令和栈指针)保存在关键OS状况存储区706中。然后OS切换器408获取针对次级操作系统202的存储执行状况708,并将它们写入到关注的寄存器中。
●如果存在对于关注的次级OS的虚拟中断,则中断处理器412调用次级操作系统内的相关中断服务例程710,该相关中断服务例程710服务于中断,然后在完成时回复到执行次级操作系统的停止处的线程712。
如果中断处理器412当前没有未决中断,则硬件资源调度程序操作切换器408利用恢复的操作系统状况内的所存储的程序计数器值,使次级操作系统从其停止处(在这种情况下从线程712处)重新开始执行。
由此,在关键操作系统201已经执行了某些功能(或者服务于其自己的应用或服务,或者服务于针对另一操作系统的中断)之后,硬件资源调度程序将控制交回给如由调度器410所确定的下一个次级操作系统202。
中断时次级操作系统到关键操作系统的切换参照图8,下面揭示从次级操作系统转换到关键操作系统的过程。在这种情况下,系统正在执行在关键操作系统202上运行的应用208a的线程712。
当发生硬件中断时,硬件资源调度程序启动OS切换器,来将次级操作系统状况保存在状况存储区708中。然后硬件资源调度程序切换到主操作系统201,从状况存储区706恢复状态变量的值,并且调用主操作系统201的中断服务例程704。在服务于中断之后,主操作系统201的调度器可将控制从ISR 704交回给先前正在执行的任意线程704(或者要执行的线程)。
当处理ISR和全部线程时,主操作系统201按参照上述图7所讨论的方式将控制交回给硬件资源调度程序,该硬件资源调度程序从主操作系统201进行切换(将状态变量保存在状况存储区706中),并切换到所选的次级操作系统201(从状况存储区708中获取状态变量)。
操作系统间通信一虚拟总线418虚拟总线例程与各操作系统中的虚拟总线驱动器协作。虚拟总线例程对连接操作系统的物理总线(类似于插入cPCI底板的紧凑型PCI(cPCI)板)进行仿真。各操作系统设置有针对该虚拟总线上的虚拟总线桥设备的驱动器例程,允许操作系统及其应用通过任何希望的协议来通信,从原始数据传送到全IP协议栈。
硬件资源调度程序虚拟总线基于上面已经讨论过的共享存储器和系统交叉中断原理。具体地,虚拟总线例程418仿真C5buscom DDI定义虚拟总线桥共享设备的syscom,从而允许通过虚拟总线导出(共享)存储器,并触发到其他操作系统中的交叉中断。
各次级操作系统中的各虚拟总线驱动器,在启动时在硬件资源调度程序硬件库中创建这种虚拟总线桥。由此,各虚拟总线驱动器导出(共享)其专用存储器区,并提供增加其主机系统内的中断的方法。
由此,第一操作系统的虚拟总线驱动器通过如下步骤向第二操作系统发送数据■写入到由第二操作系统的对等虚拟总线驱动器导出的存储器中,然后;■触发交叉中断来通知该数据可为第二操作系统中的对等总线驱动器所获得。
在相反(输入)方向上,虚拟总线驱动器在接收到表示已将输入数据存储在其自身导出的存储器区中的交叉中断时,向上游传播这种数据(用于由其针对的应用或例程所使用)。
参照图9a,要与在同一操作系统202上运行的另一应用208b进行通信的应用208a,可通过该操作系统进行这种操作。在一个操作系统201上运行的应用207b(其要与在不同操作系统202上运行的另一应用208b通信),通过利用其操作系统的API向虚拟总线写入数据来进行这种操作,所述操作系统利用虚拟总线驱动器例程将数据传递到另一操作系统202,该另一操作系统202将该数据从虚拟总线驱动器传送到应用208b。
参照图9b,将该配置移植至其中第一和第二操作系统在不同的计算机100、101上运行的配置中所需的改变很少;仅需要改变操作系统所用的驱动器,使得它们使用针对实际总线103的驱动器而非虚拟总线驱动器。因此使得该系统更加独立于该系统在其上运行的硬件。
应用可以通过硬件资源调度程序虚拟总线进行通信,但是还可以由操作系统内核内部使用该通信,从而它们可以在实现分布在多个操作系统之间的服务方面进行协作。这种“智能”分布服务包括用于系统热重启(如上所述)的软件监视或者分布式网络协议栈。
调试在优选实施例中,硬件资源调度程序具有第二工作模式,在该第二工作模式下,硬件资源调度程序用作调试代理。
根据本实施例,在第二模式下,硬件资源调度程序可经由串行通信线与在另一机器(“主”机)上运行的调试软件工具进行通信。
这种调试工具提供高级图形用户界面(GUI)来远程控制硬件资源调度程序。使用硬件资源调度程序虚拟化异常机制来截获所定义的异常。用户接着可以配置并控制硬件资源调度程序在处理器异常的情况下如何表现,并且还显示机器状态和系统状态,以使得能够诊断代码或者其他系统错误或问题。
用户可以选择一个或更多个这种处理器异常,作为从操作系统到硬件资源调度程序的陷入调用的基础。基于所选异常,当在执行期间发生该或各异常时,操作系统停止,并执行对硬件资源调度程序的陷入调用,硬件资源调度程序接着保存当前状况,并使得能够与主机上的调试工具进行交互。用户接着使得显示状态变量(如堆栈指针、程序和地址计数器)的当前状态和/或所选存储器块的内容。用户可以指定在待调试的特定操作系统中应陷入的给定类型的异常,或者指定在任何操作系统中当这些异常发生时都应将其陷入。相应地,仅在一个操作系统或者在全部操作系统中实现陷入调用。用户还可以指定是在重启执行时要将给定类型的异常正常地转交至系统,还是简单地忽略时该异常。
由于硬件资源调度程序在其自身环境中执行,所以它能够对操作系统调试得比在该系统内能完成的更多。重要的是,在用作调试代理的硬件资源调度程序与正被调试的系统之间,不共享代码。这例如允许对诸如异常向量或中断服务例程的甚至内核低级代码进行调试。
根据本实施例的总体(主机/目标)调试架构的一些其他方面,类似于在文献“C5 1.0 Debugging Guide”中所描述的针对Chorus和C5调试系统的调试架构,该文献由Jaluna公布,并且可在http//www.jaluna.com/doc/c5/html/DebugGuide/book1.html处获得。
安全架构应当清楚,上述实施例给出了安全架构的稳固基础。这是因为次级操作系统(用户通常在其上运行不安全的应用)与指定系统资源隔离,并且仅通过硬件资源调度程序(和主操作系统的驱动器)来访问指定系统资源。由此,可在主操作系统上运行安全应用,该主操作系统例如执行加密/解密,允许访问经加密的文件,管理、存储并提供密码和其他访问信息,管理并记录对版权资料的访问和复制。在次级操作系统上运行的应用不能访问未分配给该操作系统的系统资源,并且当操作系统在不同存储器状况下运行(即,对不同空间采用不同的寻址指针)时,在次级操作系统上运行的应用不能被用来干扰在主系统上运行的那些应用从而削弱其操作的安全性。
Intel架构实施例特征下面,将硬件资源调度程序作为超微内核进行描述(并非旨在限制)。这一节关注超微内核实现的IA-32 Intel特定方面,具体地,关注作为超微内核环境的基石的超微内核执行。
描述如何使用IA-32 Intel处理器架构来实现能够并行运行多个独立操作系统的超微内核执行,这些独立操作系统共享中央和浮点处理器单元(CPU和FPU)以及跨这些操作系统的存储器管理单元(MMU)。
还描述超微内核执行如何处理硬件中断。具体地,描述了用于截获硬件中断并将其转交至主操作系统的机制,以及对次级操作系统设置的软件中断机制。
需要注意的是,我们假设超微内核在单处理器计算机上运行,因此在此不再给出与对称多处理器(SMP)架构相关的方面。
概述虚拟地址空间在IA-32 Intel架构上,超微内核始终在虚拟地址空间中运行,换言之,使得MMU始终能够操作。另一方面,在其中执行超微内核代码的存储器状况可随时间改变。
在该说明书中,术语“处理器状况”指IA-32地址转换树,其根目录表由CR3寄存器来指定。
通常,支持用户模式处理的操作系统创建多个存储器状况(每用户处理一个)以能够处理专用用户虚拟地址空间。内核每当其从一个用户处理切换到另一个时改变存储器状况。另一方面,与用户地址空间一起,操作系统内核还处理在全部存储器状况中被复制的唯一的监管地址空间。用户和监管虚拟地址在IA-32 Intel架构上从不交叠。
监管地址空间映射可以是静态或是动态的。在系统初始化时创建静态映射,并且静态映射通常(完全或部分地)映射可用物理存储器。这种映射还称作一对一或内核虚拟(KV)映射。具体地,KV映射通常覆盖内核代码、数据和bss部分。在运行时创建动态映射以访问动态地加载的内核模块或访问动态地分配(非邻近)的存储器组块。
在超微内核环境下区分三类存储器状况主、次级以及超微内核。
主存储器状况是主内核当前所用的存储器状况。需要注意的是,在主操作系统支持用户地址空间的情况下,可能存在多个由主内核使用的存储器状况,但是如上所述,监管地址空间在所有这种状况中是相同的。因为超微内核不关注用户映射,所以从超微内核方面来看主存储器状况是唯一的,并且其包含在主内核所建立的静态和动态监管映射中。
次级存储器状况是次级内核当前所用的存储器状况。再次,在次级操作系统支持用户地址空间的情况下,可能存在多个由次级内核使用的存储器状况,但是监管地址空间在所有这种状况中仍旧相同。因为超微内核仅察觉(aware about)次级内核所建立的静态KV映射,所以从超微内核方面来看(对于给定的次级内核)次级存储器状况是唯一的,并且其包含这种一对一映射。重要的是需要注意超微内核需要通过静态KV映射对超微内核所用的次级内核数据的可访问性。在描述针对次级内核的超微内核接口的其他节中列出了这种数据结构。
超微内核存储器状况由超微内核自身来构建。该状况复制由主内核以及由全部次级内核所建立的全部KV映射。为了能够创建这种存储器状况,超微内核需要兼容全部KV映射。当且仅当两个KV映射或者不交叠或者相同时,它们才相兼容。
需要注意的是,当运行多个相同次级内核时,它们的KV映射自然相同,并因此兼容。然而当主操作系统不同于次级操作系统时会出现问题。在这种情况下,可能必需修改一个系统来获得KV映射兼容性。
超微内核存储器状况主要用于执行当次级内核被超微内核所处理的中断、陷入或异常事件(例如为了执行针对超微内核控制台的I/O操作)抢先时的超微内核代码。超微内核存储器状况还用作中间地址空间,以允许从次级执行环境切换至主执行环境,反之亦然。
超微内核二元码占据主KV映射中的位置,并且或者在主存储器状况中或者在超微内核存储器状况中执行超微内核代码。换言之,按照由主内核定义的一对一映射适当执行超微内核代码。当超微内核抢先主内核时,在主存储器状况中执行超微内核代码。当超微内核抢先次级内核时,在复制主KV映射的超微内核状况中执行超微内核代码。需要注意的是,通常由于在主存储器状况中执行由主内核所调用的超微内核操作并因此可直接访问主监管地址空间,所以对于由超微内核所用的主数据没有限制。另一方面,超微内核在切换至次级内核/从次级内核切换期间要求可通过静态KV映射访问超微内核所用的某些主内核数据。在描述针对主内核的超微内核接口的其他节中列出了这种数据结构。
图10示出了主、次级和超微内核虚拟地址空间的示例。
在该示例中,物理存储器大小为128兆字节。该主内核采用普通的从零开始的一对一(KV)映射(类似C5微内核),而次级内核采用从0xc0000000开始的移位一对一(KV)映射(类似Linux内核)。这些KV映射是可兼容的,并且超微内核地址空间两次映射物理存储器来复制一对一映射。
图11示出了在时间上如何切换存储器状况。最初,在次级存储器状况下运行次级操作系统。在t0时,当前次级内核陷入超微内核来向超微内核控制台输出字符。该陷入把当前存储器状况切换至超微内核存储器状况。在[t0,t1]时段期间,超微内核(在超微内核存储器状况下运行)向超微内核控制台打印输出字符。在t1时,超微内核返回到次级内核,从而切换回次级存储器状况。在t2时,在运行次级操作系统的同时发生中断。中断把当前存储器状况切换至超微内核存储器状况,并启用超微内核中断处理器。为了将中断转交至主内核,在t3时超微内核从超微内核存储器状况切换至主存储器状况,并启用主中断处理器。在中断请求处理期间,在t4时,主内核启用超微内核写方法以在超微内核控制台上输出消息。需要注意的是,这是简单的、间接的调用,该调用不切换存储器状况,并且完全在主存储器状况下执行写操作。
在t5时,超微内核从写方法返回至主内核,主内核继续中断请求处理直到t6时。此时,主内核从中断处理器返回,并且超微内核切换回中断的次级操作系统以继续次级操作系统的执行。这种切换开始于主存储器状况,并且经过中间超微内核状况,最终在t7时结束于次级存储器状况下。
超微内核启用和抢先或者显式地通过函数调用/陷入或者隐式地通过中断/异常处理器来启用超微内核。在前一种情况下,我们称操作系统内核启用超微内核。在后一种情况下,我们称超微内核抢先操作系统。重要的是需要强调始终从在监管地址空间中运行的优先代码启用超微内核。另一方面,超微内核作为内核本身以及在内核控制下运行的用户处理来抢先。
一旦引导了系统,则首先激活超微内核,并且其开始执行主和次级内核。一旦完成了初始化阶段,则超微内核起到被动作用。这意味着由(通过调用或陷入)显式启用超微内核的主和次级内核、或者由外部产生的同步(即,异常)和异步(即,中断)事件来驱动在超微内核中执行的代码。
在IA-32 Intel架构中,用于超微内核启用和抢先的机制不同于用于主和次级操作系统的机制。就执行环境而言,超微内核非常接近主内核。其利用相同的存储器状况,并且有时利用相同的监管堆栈。由此,超微内核大致具有与主内核相同的可获性。另一方面,次级操作系统和超微内核之间存在障碍,这提供了针对次级内核故障的一些保护。然后需要注意的是,这种保护不是绝对的,而次级内核还能够使主内核以及超微内核崩溃。
主启用主内核通过简单的间接调用来启用超微内核。启用不切换存储器状况。
主抢先超微内核通过中断门抢先主操作系统。抢先不切换存储器状况,并且将本机主监管栈用于处理抢先。
超微内核仅在极少的情况下抢先主操作系统。其中之一是超微内核用来处理如在该文件中进一步描述的按照懒惰方式在内核之间共享的FPU的设备不可获异常(#NM)。
次级启用次级内核通过陷入来启用超微内核。超微内核通过切换至超微内核存储器状况并启动陷入任务执行的任务门来截获这种陷入。
次级抢先次级操作系统的超微内核抢先类似于启用机制,并基于任务门。当次级系统被中断或异常抢先时,对应的任务门切换至超微内核存储器状况并启动执行对应的超微内核任务。
内核状况超微内核数据可被分成两类全局数据和按内核数据(per-kernaldata)。全局数据保持全局超微内核状态(例如,超微内核存储器状况),而按内核数据保持与给定的主或次级内核相关的状态。按内核数据还被称作内核状况。
该内核状况包括两个部分可见的和隐藏的。可见部分是公开的,并占据超微内核接口中的一部分。在与超微内核接口相关的其他节中将详细描述内核状况的该部分。隐藏部分对于内核是不可见的,并被超微内核执行内部使用。
超微内核执行接口该章描述被输出给主和次级内核的超微内核执行接口。这种接口包括在内核与超微内核(即,可见内核状况)之间共享的数据以及超微内核方法。需要注意的是,超微内核接口是内核角色特有的,并且(严格的说)对于主和次级内核是不同的。另一方面,在这两个接口之间存在很大的交集,这可以与内核角色无关地来进行描述。
可见内核状况图12示出了内核状况的可见部分。
在循环列表中链接全部内核状况(主以及次级)。next域指在这种列表内的下一内核状况。需要注意的是,在内核状况的可见部分,全部引用通过物理地址来进行。内核不得不将这种物理地址转换为虚拟地址(根据KV映射)以访问所引用的目标。该图示出了仅具有两个内核的配置主和次级。主状况指向次级状况,次级状况反过来指向主状况。
pending VEX和enabled VEX域反映了虚拟异常的当前状态。需要注意的是,这些域对于主状况是无意义的,因为主内核异常不由超微内核虚拟化。在该文件中将进一步详细描述虚拟化异常机制以及次级内核执行模型。
boot info域指向BIOS给出的引导参数。该域是只读的。
需要注意的是,这种数据结构是内核专用的,因此还被定位在内核状况中。在其他域中,引导参数结构指向指定引导时间参数的引导命令行。这种参数或者被提供给引导加载器(例如,GRUB引导加载器)或者通过超微内核环境被传递。命令行是内核专用的,并且其也定位在内核状况中。超微内核解析初始命令行以创建仅包含与对应内核相关的参数的内核专用命令行。
RAM info域指向RAM描述表。该域为只读的。RAM描述表为由全部内核共享的全局数据结构。其描述了RAM资源如何分布在内核中。
dev info域指向由超微内核概括的虚拟设备列表。该域对于次级内核是只读的,而对于主内核是读写的。设备列表是全局的,并由全部内核来共享。列表中的各虚拟设备由超微内核指定的数据结构来表示。通常由主同级驱动器和次级同级驱动器利用由超微内核定义的规则来访问该数据结构。主同级驱动器起到服务器的作用以支持虚拟设备,而次级同级驱动器起到客户机作用以利用虚拟设备而不是实际设备。仅由主内核来创建(并修改)该列表。次级内核仅被允许浏览该列表。
pending XIRQ域指定未决交叉中断。该域不由超微内核本身使用。由状况结构来控制(host)该域以辅助交叉中断交换中的主和次级内核。仅存在一个专用于交叉中断传递的异常。该pending XIRQ域允许将交叉中断的数量扩展达到32个(每个交叉中断源一位)。交叉中断位由源内核(即,发送交叉中断的内核)来设定并由目的地内核(即,接收交叉中断的内核)来复位。
ID域包含唯一的内核标识符。该域为只读的。将标识符0分配给超微内核本身,而将标识符1分配给主内核。内核标识符指定超微内核接口上的内核。例如,采用内核标识符来标记分配给给定内核(例如,RAM描述表中的存储器组块)的资源。
running域是指定内核状态(运行或中止)的标志。该域为只读的。超微内核在启动(launch)内核前设置该标志,并且一旦内核中止就清除该标志。当重启内核时,running标志先被清除然后被设定。任何内核都能够浏览内核状况的循环列表,并能够分析running标志以找到全部运行的同级内核。需要注意的是,始终针对主内核来设置running标志。
可见内核状况的最末部分是角色专用的。
主状况指定超微内核接口方法的地址。主内核采用这些地址来通过间接函数调用来启用超微内核。方法地址由超微内核来建立,并且不必由主内核来修改。在下一节中将详细描述超微内核接口方法。
次级内核采用陷入机制而不是间接调用来启用超微内核。因此,在次级状况中不存在超微内核接口方法的地址。相反,次级状况具有secondary TS bit域,该域保持CR0寄存器中的TS位状态。这种TS位的软件映像可由次级内核来使用,以按照如在本文件中将进一步详细描述的懒惰方式来管理FPU资源。
超微内核方法超微内核提供了两组方法控制台I/O操作和执行操作。控制台I/O组允许内核向/从超微内核控制台串行线发送/接收字符。该文件没有专门解释或多或少是通用的控制台I/O方法,而是关注IA-32 Intel架构专用的执行方法。
基本上,超微内核环境以超微内核方法来替代一些IA-32 Intel处理器指令。这种替代指令通常加载或存储一些IA-32 Intel处理器寄存器■全局描述符表寄存器(GDTR)■中断描述符表寄存器(IDTR)■任务寄存器(TR)加载/存储GDT寄存器(LGDT/SGDT)在超微内核环境下,代替经由IA-32 lgdt/sgdt指令直接加载到GDT寄存器/从GDT寄存器直接存储,内核必须启用lgdt/sgdt超微内核方法来进行这样的操作。这些方法对于主和次级内核是类似的,除了它们对于主内核是间接调用,而对于次级内核是陷入。
类似于处理器指令,lgdt/sgdt超微内核方法仅取一个指定6字节存储器位置(包含本机表基址(虚拟地址)和本机表限制(表的字节大小))的参数。重要的是需要强调本机GDT必须始终位于KV映射内(即使对于主内核)。
超微内核管理按内核全局描述符表。该(实际)表驻留在图13所示的内核状况的隐藏部分中。与实际GDT一起,超微内核保持针对本机GDT(其经由lgdt方法被提供给超微内核)的指针。超微内核通过复制段描述符根据本机GDT来初始化实际GDT。然而需要注意的是,为超微内核段保留实际GDT的一部分。超微内核处理指定本机与实际表之间的映射的位串。对于实际表中的各条目,该映射指定该条目是否用于超微内核段,或者其是否是从本机表继承的,因此包含对应内核段的副本。不由lgdt方法来更新用于超微内核段的实际条目。
超微内核段位于实际表的末端,实际表的默认大小为256个条目。当将内核移植到超微内核架构时,应当通过在本机表内重排内核段(将它们移到表的开头)或者通过增大实际GDT大小来避免内核段与超微内核段之间的交叠。
加载/存储IDT寄存器(LIDT/SIDT)在超微内核环境下,代替经由IA-32 lidt/sidt指令直接加载到IDT寄存器/从IDT寄存器直接存储,内核必须启用lidt/sidt超微内核方法来进行这样的操作。这些方法对于主和次级内核是类似的,除了它们对于主内核是间接调用,而对于次级内核是陷入。
类似于处理器指令,lidt/sidt超微内核方法仅取一个指定6字节存储器位置(包含本机表基址(虚拟地址)和本机表限制(表的字节大小))的参数。重要的是需要强调本机IDT必须始终位于KV映射内(即使对于主内核)。
超微内核管理按内核中断描述符表。该(实际)表驻留在图13所示的内核状况的隐藏部分中。与实际IDT一起,超微内核保持针对本机IDT(其经由lidt方法被提供给超微内核)的指针。超微内核通过复制门描述符根据本机IDT来初始化实际IDT。
需要注意的是,为了截获异常超微内核可将其自己的门加载在实际表中。例如,超微内核截获设备不可获异常(#NM)以管理按照懒惰方式共享的FPU。因此,类似于GDT,超微内核处理指定本机表与实际表之间的映射的位串。对于实际表中的各条目,该映射指定该条目是否加载有超微内核门,或者其是否是从本机表继承的,因此包含对应内核门的副本。不由lidt方法来更新加载有超微内核门的实际条目。
实际表大小必须等于或大于本机表大小。如果当将内核移植到超微内核架构中时不满足该要求,则必须增大实际表大小或者必须减小本机表大小。
加载任务寄存器(LTR)在超微内核环境下,代替经由IA-32 ltr指令直接加载到任务寄存器,内核不得不启用ltr超微内核方法来进行这样的操作。该方法对于主和次级内核是类似的,除了它对于主内核是间接调用,而对于次级内核是陷入。
类似于处理器指令,ltr超微内核方法仅取一个指定段选择器(其指向任务状态段(TSS))的参数。重要的是需要强调由段选择器指出的TSS必须始终位于KV映射内(即使对于主内核)。
空闲超微内核提供必须由内核在空闲循环内调用的空闲方法。该空闲方法等同于IA-32 Intel hlt指令,并且该空闲方法通知超微内核调用内核不进行任何操作直到下一次中断为止。该方法对于主和次级内核是类似的,除了它对于主内核是间接调用,而对于次级内核是陷入。
空闲方法启用导致系统切换到下一个准备以运行次级内核(如果可以的话),或者当全部次级内核为空闲时,导致从主空闲方法返回。该空闲方法没有参数。
应利用使能处理器中断来调用该主空闲方法,并且该主空闲方法始终利用禁用处理器中断返回至调用方(caller)。因此,一旦从超微内核空闲方法返回,则主内核能够直接执行紧随IA-32 hlt指令的IA-32 sti指令来挂起处理器直到下一中断为止。
可利用使能或禁用(软件)中断来调用次级空闲陷入,并且该次级空闲陷入始终利用使能中断返回至调用方。实际上,次级空闲陷入隐式地使能中断,并且一旦将中断作为虚拟异常(VEX)传递给该内核其就返回至调用方。
重启超微内核提供重启方法,该重启方法可由主内核与由次级内核一样地调用来重启次级内核。该方法对于主和次级内核是类似的,除了它对于主内核是间接调用,而对于次级内核是陷入。
方法参数指定了正在重启的内核的标识符。超微内核停止内核执行,根据内核映像副本恢复内核映像,并且最后在初始条目点启动内核执行。
次级重新引导由超微内核向次级内核提供重新引导陷入。当重新引导时由次级内核来调用这种陷入。该陷入等同于对内核本身调用的重启陷入。
次级中止由超微内核向次级内核提供中止陷入。当中止时由次级内核来调用这种陷入。超微内核将调用方内核置于非运行状态下以避免超微内核调度器切换该内核。
停止的内核可由上述重启超微内核方法再次启动。
主执行环境基本上,主内核在本机执行环境下执行。IA-32 Intel处理器上的超微内核实现试图最小化超微内核环境对主操作系统特性(性能、中断等待时间、抢先等待时间)的影响。由于主操作系统通常为实时操作系统,所以保持主内核行为不变是很重要的,即使其他(次级)操作系统正在同一处理器上并行运行。
初始化最初由具有禁用MMU的引导加载器(即,在物理空间中)启动超微内核。基本上,超微内核初始化代码在物理存储器中安装主存储器排(包含主内核代码/数据/bss部分),并跳至主入口点。
在跳至主内核之前,超微内核把主内核状况(具体地,实际GDT和IDT)初始化至初始状态。
初始主GDT仅具有两个指定超微内核代码和数据段的有效条目。超微内核接口分别把用于内核代码和数据段的选择器固定(fix)至0x10和0x18。因此,当将内核移植至IA-32超微内核架构时,不得不采用上述代码和数据段。
初始主IDT以及任务寄存器中的全部门都是无效的(零)。
利用位于数据段中的静态超微内核栈来执行超微内核初始化代码。当跳至主内核时,该栈依然有效。尽管如此,主内核仍应尽快切换至其自己的栈,并且将来应不再使用该超微内核栈。不仅在初始化阶段而且在运行时都采用该超微内核栈以处理在下一章中所描述的次级启用和抢先。
当跳至主内核时,%esi寄存器指向内核状况,并清空eflag寄存器。因此,在主初始化阶段开始时禁用处理器中断。一旦完成了关键初始化阶段,则主内核通常使能中断。
在初始化阶段期间,主内核通常启用超微内核方法来设置GDT、IDT以及任务寄存器。最后主内核进入空闲循环并启用超微内核空闲方法。
当首次调用空闲方法时,超微内核获知主内核已完全初始化了其执行环境,并且主内核进行到了后初始化阶段。
在这种后初始化阶段中,超微内核如在下一章中所描述地建立了超微内核存储器状况,并初始化次级内核状况。需要注意的是,超微内核存储器状况创建推迟到后初始化阶段,这是因为其需要分配用于构建转换树的物理存储器,但是由主内核初始化代码来发现并登记可用存储器资源。一旦完成了后初始化,则超微内核调用调度器以切换至准备运行次级内核或者如果全部次级内核为空闲则从主空闲方法返回。
超微内核要求主内核初始化全局共享的数据结构RAM描述符和虚拟设备列表。在调用空闲方法之前不得不完成这种初始化。该要求是自然的,因为过了此时次级内核可访问全局共享的数据结构。
具体地,主内核负责检测板上可用的物理存储器,并将空闲物理存储器组块登记在RAM描述符中。
根据主板级支持包(BSP),主内核应启动超微内核察觉驱动器,该超微内核意识驱动器接着应填充虚拟设备列表。为次级内核设置这种虚拟设备,因此应在启动第一个次级内核之前创建这种虚拟设备。
截获的异常基本上,超微内核不截获在主操作系统在处理器上运行时发生的异常。由本机主处理器来处理全部编程异常、陷入以及中断。当移植至IA-32Intel超微内核架构时无需修改主低级处理器。
遵从上述准则的异常为与FPU仿真相关的编程异常无效操作码异常(#UD)设备不可获异常(#NM)超微内核采用FPU仿真特征来实现如在本文件中进一步描述的FPU共享的懒惰机制。
另一特殊情况是调试代理,其能够嵌入到超微内核中来提供对主操作系统的基于主机的远程系统调试。在这种情况下,调试代理通常截获如上按照更一般方式描述的某些与调试特征(例如,单个指令跟踪)或者与程序错误(例如,页失效(page fault))相关的同步异常。
转交中断当次级操作系统在处理器上运行时发生中断时,将中断转交至主操作系统。这种中断转交处理经过以下主要步骤■由超微内核截获中断;■挂起对被抢先的次级内核的执行并且超微内核切换至主执行环境;■超微内核利用itn指令触发对主内核的对应中断。
按照这种方式,调用对应的主低级中断处理器(在主执行环境下)以处理中断。一旦处理了中断,则主内核返回至执行iret指令的超微内核。
在从主中断处理器返回之后,超微内核调用调度器以确定要运行的下一次级操作系统。需要注意的是,不必在中断之后继续被抢先的次级系统。另一(更高优先级)次级系统可能由于中断而准备运行。
次级执行环境基本上,次级内核执行环境除了中断管理之外非常接近于本机环境。超微内核环境修改中断管理的本机机制来使得次级操作系统可完全抢先。移植到超微内核架构的次级内核不再禁用处理器级的中断,而是采用由超微内核提供的软件中断屏蔽机制(即,虚拟异常)。不再由这种次级内核直接地处理中断,而是由超微内核来对它们进行截获,将它们转交至主内核,并且仅由次级内核按照推迟方式可选地进行处理。
初始化超微内核在初始化时将次级存储器排与主排一起安装。另一方面,对次级内核的最终初始化(具体地,为内核状况设置)被推迟到后初始化阶段。
在该阶段,超微内核分配存储器来保存次级存储器排的副本。然后利用这种副本来在重启时恢复次级系统的初始映像。然而次级系统重启是可选的,并且为了减小物理存储器消耗其可能被禁用。
类似于主内核,超微内核初始化实际GDT和IDT以及位于内核状况的隐藏部分中的初始TSS(参见图13)。
类似于主实际GDT,初始次级实际GDT具有两个指定超微内核代码和数据段的有效条目。超微内核接口分别把针对超微内核代码和数据的段选择器分配为0x10和0x18。另外,次级实际GDT包含指定超微内核任务使用的超微内核TSS数据结构的描述符。如在下一节中所述,这种超微内核任务被用来截获次级异常。超微内核TSS描述符位于实际GDT的末端。
在实际IDT中,超微内核安装任务门以截获硬件中断和超微内核陷入。为了能够在次级初始化时处理严重异常,全部其他异常也都被超微内核临时截获,直到通过lidt超微内核陷入安装了本机IDT为止。如果发生这种突出(严重)异常,则超微内核仅中止次级内核,但是这既不干扰主系统,也不干扰其他次级系统。一旦安装了本机IDT,则由本机异常门来覆盖最初使用的严重异常门。然而需要注意的是,这并不涉及在下一节中描述的永久截获的异常。
超微内核启动次级内核,来执行向位于次级内核状况中的初始TSS的任务切换。图14示出了如何在任务切换之前对初始TSS进行初始化。需要注意的是,图中仅示出了非零域,而隐去了全部零域。
类似于主内核,将内核状况物理地址传递到%esi寄存器上。另一方面,和主内核不同的是,在处理器标志域(EFLAGS)设置中断标志(IF),使得即使在次级内核初始化阶段期间也能够进行处理器中断。应当注意,甚至次级内核初始化代码也可由主系统完全抢先。这在为了当重启次级操作系统时不干扰主操作系统方面尤为重要。
尽管使得可以进行硬件中断,但是当启动次级内核时禁用虚拟异常(对应于硬件中断)。因此,不能由超微内核来传递中断,直到它们可由内核在关键初始化阶段结束时显式使能为止。本文件中将进一步对软件中断屏蔽机制(基于虚拟异常)进行详细描述。
CR3域指向一对一转换树。这种初始一对一映射被临时提供给次级内核。需要注意的是,不应由初始化代码修改或永久使用该映射,相反,次级内核应建立其自己的KV映射,并尽快切换至此。
当启动次级内核时栈指针无效。通常,次级内核使用位于数据部分中的静态初始栈来执行其初始化代码。
类似于主内核,在初始化阶段期间,次级内核通常调用超微内核陷入来设置GDT、IDT和任务寄存器。最后次级内核进入空闲循环并调用超微内核空闲陷入。
截获的异常为了截获次级异常,超微内核将任务门安装至实际IDT的对应条目。因此,当发生这种异常时,IA-32 Intel处理器执行任务切换,该任务切换将处理器状态保存至当前任务状态段(TSS),并从异常任务门所指定的TSS来恢复处理器状态。
对于各个截获的异常,超微内核创建由位于实际GDT内的专用段描述符所指出的专用TSS数据结构。这种超微内核段(用来参照超微内核TSS数据结构)位于实际GDT末端。根据超微内核执行环境类似地对全部超微内核TSS数据结构进行初始化。图15示出了超微内核TSS的非零域。在图中隐去了TSS数据结构的零部分。
EIP域包含超微内核异常任务的地址。EBX域指向异常描述符。需要注意的是,多个截获的异常可在同一超微内核异常任务中复用。例如,将同一任务用于截获全部硬件中断。在这种情况下,这种被复用的任务可采用异常描述符(在%ebx寄存器中可获得)来获取异常特有信息。
可根据全部截获的异常的特征将它们分类为中断、陷入以及编程异常(失效)。
超微内核截获全部硬件中断(包括非可屏蔽中断(NMI))来将它们转交至主内核。
实际上,由超微内核截获的陷入为如下超微内核启用■通用陷入■XIRQ陷入■STI陷入■IRET陷入通用陷入组合了类似控制台I/O、lgdt/sgdt、lidt/sidt、ltr、中止、重新引导、重启的全部非性能关键的超微内核启用。针对常规陷入,在通用寄存器上传递超微内核方法号和实际参数。由公共异常任务来处理通用陷入,公共异常任务根据在%eax寄存器中编码的号来调用超微内核方法。
其他三个陷入为性能关键的,并由特定超微内核任务来对它们进行处理。这些陷入没有实际参数。
XIRQ陷入向主内核发送交叉干扰。XIRQ陷入任务等同于中断任务,除了被转交至主内核的异常对应于软件中断而非硬件中断。因此,类似于中断,XIRQ陷入抢先当前次级内核。
STI和IRET陷入两者均由次级内核来调用以处理未决虚拟异常。这些陷入占据软件中断屏蔽机制的一部分,并将在针对虚拟异常的下一节中对它们进行详细描述。
类似于主内核,超微内核通常不截获编程异常,除了如下描述的一些特殊情况。
超微内核截获与FPU仿真相关的以下异常
●无效操作码异常(#UD)●设备不可获异常(#NM)超微内核采用FPU仿真特征来实现如在本文件中进一步描述的FPU共享的懒惰机制。
另一特殊情况是调试代理,其能够嵌入到超微内核中来提供对次级操作系统的基于主机的远程系统调试。在这种情况下,调试代理通常截获某些与调试特征(例如,单个指令跟踪)或者与程序错误(例如,页失效)相关的同步异常。然而这种调试代理设计超出了本文件的范围。
虚拟异常虚拟异常(VEX)是超微内核提供的机制,其允许内核将异常传递到次级内核,并按照推迟方式将其进行传递。具体地,在IA-32 Intel超微内核架构中使用VEX机制,以针对次级内核用软件中断来取代硬件中断。
VEX接口存在于位于内核状况中的两个域pending(未决)和enabled(使能)。这些域仅对次级内核状况是有意义的,但是主和次级内核两者都可对它们进行访问。全部虚拟异常由pending(或enabled)域中的位的位置来列举。因此,在IA-32 Intel架构中总共存在32个由超微内核支持的虚拟异常(pending和enabled域为32位整数值)。
下表中示出了虚拟异常如何被映射到实际异常

将从0直到16的虚拟异常映射到硬件中断。虚拟异常17被映射到用于向次级内核传递交叉中断的实际异常46。目前不采用从18直到30的虚拟异常,而保存它们用于未来扩展。虚拟异常31不对应于任何实际异常,它实际上是伪虚拟异常,由超微内核内部使用它以检测内核是否为空闲。在该文件中将进一步详细描述这种伪虚拟异常如何工作。
因为多个虚拟异常可同时未决,但是仅偶尔处理它们中的一个,所以根据全部虚拟异常的编号来排列其优先次序。将最高优先级分配给NMI,而将最低优先级分配给Running(运行)伪异常。
次级状况的pending VEX域通常由主内核来更新,主内核提供对虚拟PIC设备的驱动器。这种驱动器通常通过在pending VEX域中设置合适的位来将虚拟异常(中断)传递至次级内核。
enabled VEX域由次级内核来更新以使能或禁用虚拟异常。如果在enabled VEX域中设置对应位则使能给定虚拟异常。利用enabled VEX域,次级内核实现针对中断受保护的关键部分。换言之,次级内核不再使用cli和sti A-32指令来使能/禁用处理器中断,而是修改其内核状况的enabled VEX域。
如果给定虚拟异常是同时未决和使能的,则由超微内核来传递它。超微内核仅在跳至次级异常处理器之前复位对应未决位。
当超微内核将虚拟异常传递至次级内核时,根据本机IDT解释门描述符。为了最小化次级内核的低级处理器中的修改,超微内核在与IA-32Intel处理器所进行的相同状态下调用门处理器。换言之,超微内核按照与IA-32 Intel硬件所进行的相同方式切换栈指针、代码以及栈段,并将异常帧推入监管栈中。
然而需要注意的是,当将次级内核移植到IA-32超微内核架构上时,仍需修改低级异常处理器以考虑替代硬件中断屏蔽机制的软件中断屏蔽机制。当调用中断门处理器时,超微内核仅禁用将0x80000000写入enabled域中的全部虚拟异常。当运行次级内核时始终在处理器级使能硬件中断,因此可由甚至在低级中断门处理器内的主内核来抢先次级内核。按照这种方式,在超微内核环境中,次级操作系统可由主操作系统完全抢先。
虚拟异常在其处于禁用状态下时可由主内核来传递。在这种情况下,异常未被传递至次级内核,而是保持未决直至再次重新使能该异常为止。因此,当次级内核重新使能虚拟异常时,应当检查是否有任何虚拟异常未决。如果检查是肯定的,则次级内核应当启用超微内核以处理这种未决虚拟异常。通过利用STI或者IRET陷入来执行这种启用。
一般来说,次级内核按如下两种情况下重新使能虚拟异常■当次级内核先前已禁用虚拟异常以保护代码的关键部分时;■当由于中断门启用超微内核已禁用虚拟异常时;在前一种情况下,只要可能,次级内核就利用STI陷入来处理未决虚拟异常。一旦处理了未决异常,则超微内核将从STI陷入返回以继续次级内核执行。
在后一种情况下,次级内核当从异常处理器返回时利用IRET陷入处理未决虚拟异常。需要注意的是,IRET陷入仅替代iret IA-32指令,并且当执行陷入时,仍将异常帧推入监管栈中。还需要注意的是,超微内核不从IRET陷入返回,相反,一旦处理了未决异常,则次级操作系统执行在其被初始虚拟异常所抢先的点处继续。换言之,IRET陷入返回至在陷入时保存在位于栈顶的异常帧中的状态。
超微内核再进入大多数时候利用在处理器级处禁用的用于防止再进入内核的中断来执行超微内核代码。另一方面,某些超微内核启用会花费较长时间,因此超微内核在执行如此长的操作时不得不使能中断以使主中断等待时间较短。
存在三种长超微内核操作■同步控制台输出操作持续时间取决于串行线速度。例如,在9600波特率线上,单个字符输出会花费最高1毫秒的时间。
■lgdt和lidt操作持续时间取决于表大小。利用对于主内核禁用的中断仍然可完成这些操作,这是因为当通常无论如何禁用中断时,通常在初始化时发出中断。然而对于次级lgdt和lidt方法,显然不能接受保持中断禁用,因为在任何时候都可重启次级内核。
■次级内核重启操作持续时间取决于从副本恢复的内核映像大小。
对于上述列出的全部操作,超微内核使能中断,因此使能从主内核的再进入。另一方面,在使能中断的同时,禁用超微内核调度器以防止当从主中断处理器返回时另一次级内核被调度。换言之,超微内核可仅被主内核所抢先(由于中断),但是禁止从次级内核的再进入。这种限制允许超微内核使用针对次级执行环境的全局资源。例如,用于截获的异常的TSS数据结构是全局的,并在全部次级内核上被共享。
在主存储器状况下执行从次级内核发出的某些长操作。换言之,在执行这种操作之前,超微内核切换至主执行状况,然后使能中断。一旦完成了该操作,则超微内核禁用中断,并通过超微内核调度器返回至调用方次级内核。
然而需要注意的是,在主存储器状况下不能执行某些长操作,因为它们需要访问位于次级KV映射中的数据结构。这种操作的典型示例是次级lgdt和lidt方法,这两种方法分别访问本机GDT和IDT数据结构。因此,必须在超微内核存储器状况下完成这些操作。
还需要注意的是,优选地在超微内核存储器状况下执行常用的超微内核方法(即使也可在主存储器状况下执行这些方法)以避免由向/从主执行环境的切换所引入的额外开销。这种常用操作的典型示例是在超微内核控制台上的同步输出。
上述讨论示出了超微内核必须能够使能处理器中断,同时利用激活的次级GDT和IDT在超微内核存储器状况下执行代码。换言之,超微内核必须支持向中断任务的任务切换,同时运行执行次级超微内核方法的陷入任务。
为了支持这种任务嵌套,超微内核处理位于如图13所示的超微内核状况的隐藏部分中的按内核TSS栈。该数据结构仅对次级内核状况是有意义的。栈顶指向当前TSS,即,指向由任务寄存器指出的TSS。每当执行向/从次级内核的任务切换时就更新栈。当由任务门来激活超微内核任务时,将任务TSS推入栈中。当超微内核从超微内核任务返回时,从栈中移去顶部TSS。还由次级ltr方法来更新TSS栈,该方法改变了位于栈底的本机次级TSS。
图16示出了TSS栈的典型状态。图中上半部表示了当由中断抢先次级内核时的TSS栈估计。图中下半部表示当由中断抢先了执行长次级操作的超微内核时的TSS栈估计。需要注意的是,TSS栈从未空过,并将最大栈深度限制为多达三个。
本机TSS始终位于栈底。由本机次级内核执行环境来使用该TSS。如上所述,利用位于内核状况的隐藏部分中的初始TSS来启动次级内核。在初始化阶段期间,次级内核通常利用ltr超微内核方法来安装其自身的本机TSS。这种本机TSS覆盖TSS栈中的初始TSS。
一旦由中断抢先次级内核,或通过陷入启用超微内核方法,则由任务门来激活对应超微内核任务。超微内核任务始终将指向其自身TSS的指针推入栈中。在中断的情况下,超微内核中断任务仅切换至主内核以处理中断。在陷入的情况下,超微内核可以使能中断,同时执行长方法代码。
当使能中断时,超微内核方法可被由任务门激活的超微内核中断任务来抢先,接着切换至主内核以处理中断。一旦处理了中断,则主内核返回至超微内核以继续执行被中断的方法。
由于陷入和中断任务可嵌套,所以必须在执行任务代码时采用不同的(不交叠的)栈。超微内核采用中断任务中的特殊中断栈。
当在陷入任务中发生中断时,处理器切换至中断任务,并将通用寄存器保存在陷入栈TSS(此时为当前TSS)中。因此,一旦在陷入任务中再次禁用中断时,必须重新初始化陷入TSS中的EIP、EBX以及ESP域,因为它们可被中断所破坏。
调度器操作系统调度器的主要作用是选择要运行的下一项任务。因为超微内核控制操作系统的执行,所以超微内核调度器选择要运行的下一个次级操作系统。换言之,超微内核将额外调度级加入整个系统中。
需要注意的是,在超微内核架构中,主操作系统相对于次级系统具有更高的优先级,仅当主系统处于空闲循环中时才将CPU提供给次级系统。我们可说,主内核是不可抢先的,并且它通过在空闲循环中调用的空闲方法显式调用超微内核调度器。一旦在运行次级系统时发生中断,则调用主内核中断处理器。从主内核角度来看,这种中断抢先执行空闲循环的背景线程。一旦处理了中断,并完成了全部相关任务,则主内核返回至调用超微内核调度器的超微内核以确定要运行的下一个次级系统。从主角度来看,内核仅返回至由中断抢先的背景线程。次级活动对于主内核是透明的,并且其不改变主系统行为。
超微内核可采用不同调度策略。然而默认地,采用基于优先级的算法。需要注意的是,在同一优先级处,超微内核采用轮转(round-robin)调度策略。在系统映像建立时静态地构造给定次级内核的优先级。
无论实现哪种调度策略,调度器都不得不检测给定次级系统是否准备运行。将该条件计算为内核状况的pending VEX与enabled VEX域之间的按位逻辑运算。非零结果表示该系统准备运行。
如上所述,pending VEX和enabled VEX对中的每一位表示虚拟异常。改述该准备运行准则,我们可以说如果存在至少一个非屏蔽未决虚拟异常则次级系统处于准备运行的状态下。
在通常被映射到硬件和软件(交叉)中断中的全部虚拟异常中,存在反映内核当前是否为空闲的特殊虚拟异常(running)。
每当次级内核调用空闲方法时清除pending VEX域中的running位,而每当将虚拟异常传递至次级内核时设置pending VEX域中的running位。
通常针对运行的次级内核始终在enabled VEX域中设置running位。当启动次级内核时超微内核设置该位,而当中止次级内核时其重置该位。次级内核应当从不在屏蔽/不屏蔽映射到虚拟异常的中断时清除running位。
需要注意的是,外部代理能够通过清除/恢复在其内核状况中的enabled VEX域来挂起/继续对次级内核的执行。该特征使得可以在超微内核外实现调度策略代理,作为主内核任务。另外,这还使得对于次级内核的调试代理能够作为主内核顶部的任务来运行。这种次级调试代理的优点在于,主操作系统提供的全部服务可用于调试(例如,连网栈),并且次级内核调试可与在主操作系统上运行的关键任务并行地完成。
交叉中断这一节主要整理与超微内核交叉中断机制相关的信息(已在前面章节中给出)。
这里将考虑如下两种交叉中断■发送至次级内核的交叉中断■发送至主内核的交叉中断为了将交叉中断发送至目的地次级内核,源内核先在目的地内核状况的pending XIRQ域中设置与交叉中断源对应的位。然后源内核将交叉中断VEX传递至在目的地内核状况的pending VEX域中设置了对应位的目的地内核。一旦交叉中断处理器被超微内核所调用,则其检查pendingXIRQ域,清除与未决交叉中断源对应的位,并最终调用附于该源的处理器。源内核和目的地内核两者都采用原子指令来更新pending XIRQ域。需要注意的是,两种源内核(主和次级)采用相同的算法。
为了将交叉中断发送至主内核,次级内核首先在主内核状况的pending XIRQ域中设置与交叉中断源对应的位。然后次级内核调用执行XIRQ陷入的超微内核。超微内核立即抢先次级内核,并调用主低级交叉中断处理器,该交叉中断处理器检查pending XIRQ域,清除与未决交叉中断源对应的位,并最终调用附于该源的处理器。
交叉中断零一定不能由内核使用。为超微内核保留该中断以通知内核已经启动了中止的内核或者已经中止了正在运行的内核。换言之,交叉中断零通知运行内核改变了全局系统结构。每当内核状况中的running域状态改变时,就将其广播给全部运行内核。
FPU管理FPU引擎是通常为在超微内核环境下运行的全部操作系统所共享的计算资源。
在IA-32 Intel架构中,超微内核管理按照懒惰方式共享的FPU。这意味着在发生从一个操作系统到另一操作系统的切换时,不立即将FPU引擎提供给新调度的操作系统,相反,推迟FPU切换直到新调度的系统确实执行浮点指令并访问浮点寄存器为止。
这种懒惰FPU调度算法允许超微内核减少系统切换时间。这在减少主中断等待时间方面尤为重要,因为通常不在中断级处采用FPU,并且因此通常不必保存和恢复FPU寄存器以抢先次级操作系统并调用主中断处理器。
超微内核处理指向当前使用FPU的内核的状况的FPU所有者全局变量。在不存在FPU所有者的情况下,将FPU所有者状况设置为零。FPU状况位于内核状况的隐藏部分中。当内核不是FPU所有者时,这种状况保持FPU引擎的状态(即,浮点寄存器和状态)。显然,FPU所有者的状态由FPU引擎硬件来保持。当超微内核改变FPU所有者时,将FPU状态保存到旧FPU状况,并根据新FPU状况来将其恢复。
当FPU由非FPU所有者使用时,超微内核使用CR0寄存器中的仿真位(EM)以导致异常。CR0寄存器映像占据内核状况的隐藏部分的一部分。在系统切换时保存CR0寄存器(至旧状况)并(根据新状况)将其恢复。在除了FPU所有者(其中,清除了EM位)的全部内核状况中设置EM位。另外,超微内核为全部非FPU所有者截获无效操作码(#UD)和设备不可获(#NM)异常,同时FPU所有者按照本机方式处理这些异常。
当超微内核截获到FPU相关异常(#UD或#NM)之一时,发生FPU切换。为了在两个内核之间切换FPU引擎,超微内核释放当前FPU所有者并分配新的FPU所有者。
为了释放当前FPU所有者,超微内核将当前FPU状态保存在内核状况中并在CR0寄存器映像中设置EM位。另外,在实际IDT中安装超微内核门以截获#UD和#NM异常。
为了分配新的FPU所有者,超微内核根据内核状况恢复FPU状态并清除CR0映像中的EM位。另外,在实际IDT中安装本机门以在拥有FPU的同时按照本机方式处理#UD和#NM异常。
超微内核采用CR4寄存器的OSFXSR位以优化保存和恢复操作。CR4寄存器映像占据内核状况的隐藏部分的一部分。在系统切换时将其保存(至旧状况)并(根据新状况)恢复。超微内核采用CR4寄存器映像以确定应保存或恢复哪种FPU状况标准的还是扩展的。这允许超微内核不为既不采用MMX也不采用SIMD特征的操作系统保存/恢复所扩展的FPU状况。
因为超微内核采用CR0寄存器的EM位来实现懒惰FPU切换,所以不允许内核改变该位的状态。特别地,这意味着FPU仿真不被移植到超微内核架构的内核所支持。
需要注意的是,通常操作系统内核采用CR0寄存器的TS位以实现处理之间的懒惰FPU切换。因为CR0寄存器映像占据内核状况中的一部分且因此在系统切换时将其保存并恢复,所以在超微内核环境下本机FPU管理可以保持几乎不变。
然而需要注意的是,由任务切换自动设置TS位。这意味着即使从内核方面来看逻辑清除了TS位,也可以在次级内核中发生FPU异常。由超微内核使用的任务门来引入这种乱真FPU异常以截获次级异常。为了检测这种乱真FPU异常并平静地忽略他们(仅清除TS位),次级内核应处理TS位的软件副本。超微内核在该任务中辅助次级内核,用于在内核状况中设置专用于此的域。
其他方面和实施例根据前述内容将清楚,上述实施例仅为示例,并且可以有很多其他实施例。所提及的操作系统、平台以及编程技术全都可随意改变。对于本领域技术人员显而易见的任何其他修改、替换以及变化都应被视为落入本发明范围内,无论其是否被后面的权利要求书所覆盖。为避免疑惑,要求保护此处公开的任何和全部新主题及其组合。
权利要求
1.一种使得多个不同操作系统能够在同一计算机上并行运行的方法,包括以下步骤选择具有相对较高的优先级的第一操作系统;选择具有相对较低的优先级的至少一个第二操作系统;提供公共程序,该公共程序被设置为在预定条件下在所述操作系统之间进行切换;以及提供对所述第一操作系统和第二操作系统的修改,以使得可由所述公共程序对它们进行控制。
2.根据权利要求1所述的方法,其中,第一操作系统和第二操作系统分别与第一存储器状况和第二存储器状况相关联,并且公共程序与第三存储器状况相关联,所述方法包括以下步骤当在所述操作系统之间进行切换时,将当前存储器状况切换至第一存储器状况、第二存储器状况或第三存储器状况。
3.根据权利要求2所述的方法,进一步包括以下步骤当切换至第一操作系统或从第一操作系统切换时,将当前存储器状况切换至第一存储器状况。
4.根据权利要求2或3所述的方法,进一步包括以下步骤由第一操作系统启用公共程序,并在第一存储器状况下启动执行公共程序。
5.根据权利要求2或3所述的方法,进一步包括以下步骤由公共程序抢先第一操作系统,并在第一存储器状况下启动执行公共程序。
6.根据权利要求2所述的方法,包括以下步骤当从第二操作系统切换时,将当前存储器状况切换至第三存储器状况。
7.根据权利要求6所述的方法,进一步包括由第二操作系统启用公共程序的步骤,其中,当前存储器状况为第三存储器状况。
8.根据权利要求6所述的方法,进一步包括由公共程序抢先第二操作系统的步骤,其中,当前存储器状况为第三存储器状况。
9.根据权利要求8所述的方法,其中,第二操作系统通过陷入调用来启用公共程序。
10.根据任一前述权利要求所述的方法,其中,第一操作系统为实时操作系统。
11.根据任一前述权利要求所述的方法,其中,第二操作系统为非实时通用操作系统。
12.根据任一前述权利要求所述的方法,其中,第二操作系统为Linux或者其一个版本或变型。
13.根据任一前述权利要求所述的方法,其中,公共程序被设置为保存在操作系统之间进行切换所需的处理器状态,并根据所保存的版本来恢复在操作系统之间进行切换所需的处理器状态。
14.根据任一前述权利要求所述的方法,其中,由公共程序按虚拟形式来处理针对第二操作系统的处理器异常。
15.根据任一前述权利要求所述的方法,其中,公共程序被设置为截获某些处理器异常,并调用第一操作系统的异常处理例程来服务于这些处理器异常。
16.根据任一前述权利要求所述的方法,其中,将针对第二操作系统的处理器异常通知为虚拟异常。
17.根据权利要求16所述的方法,其中,公共程序被设置为调用第二操作系统的与未决的所述虚拟异常相对应的异常处理例程。
18.根据任一前述权利要求所述的方法,进一步包括以下步骤为所述操作系统中的每一个都提供单独存储器空间,所述操作系统中的每一个都可以在所述单独存储器空间中专用地进行操作。
19.根据任一前述权利要求所述的方法,进一步包括以下步骤为所述操作系统中的每一个都提供所述计算机的第一输入和/或输出装置,所述操作系统中的每一个都可以专用访问所述第一输入和/或输出装置。
20.根据任一前述权利要求所述的方法,其中,各操作系统利用基本上未修改的本机例程来访问所述第一输入和/或输出装置。
21.根据任一前述权利要求所述的方法,进一步包括以下步骤为所述操作系统中的每一个都提供对所述计算机的第二输入和/或输出装置的访问,所述操作系统中的每一个都可共享访问所述第二输入和/或输出装置。
22.根据权利要求21所述的方法,其中,所有操作系统都利用第一操作系统的例程访问所述第二输入和/或输出装置。
23.根据任一前述权利要求所述的方法,进一步包括以下步骤提供重启例程,该重启例程用于无需中断所述第一操作系统或所述公共程序的操作而重启所述第二操作系统。
24.根据权利要求21所述的方法,其中,所述第二装置包括协处理器,并且其中,当在所述第一操作系统与所述第二操作系统之间或者相反地进行切换时,所述协处理器的状态不变,由此如果所述操作系统切换回来而不干涉对所述协处理器的访问,则可不中断地完成其操作。
25.根据权利要求1所述的方法,其中,计算机提供一个或更多个原始地址表以由操作系统使用,并且其中,公共程序访问所述原始地址表,并在存储器中的其他位置处提供与所述原始表具有相同结构的多个复制表,每个操作系统一个复制表,每个表都用于由相应的操作系统使用,并且其中,修改所述操作系统来以访问所述复制表的例程调用代替写所述原始地址表的指令。
26.根据任一前述权利要求所述的方法,进一步包括以下步骤将所述操作系统和公共程序组合到单个代码产品中。
27.根据任一前述权利要求所述的方法,进一步包括以下步骤将所述操作系统和公共程序嵌入到计算机产品上的永久存储器中。
28.根据任一前述权利要求所述的方法,其中,每个所述操作系统都设置有空闲例程,在空闲例程中每个所述操作系统都将控制交给公共程序。
29.根据权利要求28所述的方法,其中,所述空闲例程代替处理器中止指令。
30.一种开发工具包计算机程序产品,包括用于执行任一前述权利要求中的步骤的代码。
31.一种计算机程序产品,包括根据权利要求30组合的代码。
32.一种包括CPU、存储器装置以及输入/输出装置的嵌入式计算机系统,已将根据权利要求31嵌入的程序存储在其中的永久存储器中。
33.一种包括CPU、存储器装置以及输入/输出装置的计算机系统,在其上执行包括以下内容的计算机代码具有相对较高优先级的第一操作系统;具有相对较低优先级的第二操作系统;以及公共程序,被设置为通过在预定条件下在所述操作系统之间进行切换而并行地运行所述操作系统。
34.根据权利要求33所述的计算机系统,被设置为利用权利要求1至29中的任一项所述的方法并行地运行所述第一操作系统和第二操作系统。
35.一种计算机系统,包括处理器和存储器,能够在其上执行计算机代码以分别在第一存储器状况和第二存储器状况下运行第一操作系统和第二操作系统;和公共程序,可在所述第一存储器状况或一第三存储器状况下进行操作,以在第一操作系统与第二操作系统之间进行切换,其中,公共程序进行操作所处的存储器状况取决于切换操作。
36.根据任一前述权利要求所述的系统、产品或方法,其中,计算机具有复杂指令集架构。
全文摘要
一种使得多个不同操作系统能够在同一计算机上并行运行的方法,所述计算机为Intel或类似的复杂指令集计算机架构,所述方法包括以下步骤选择具有相对较高的优先级的第一操作系统,即,实时操作系统,如C5;选择具有相对较低的优先级的至少一个次级操作系统,即,通用操作系统,如Linux;提供公共程序,即,类似于超微内核的硬件资源调度程序,该公共程序被设置为在预定条件下在所述操作系统之间进行切换;以及提供对所述第一操作系统和第二操作系统的修改,以使得可由所述公共程序来对它们进行控制。
文档编号G06F9/46GK1922576SQ200480035406
公开日2007年2月28日 申请日期2004年9月30日 优先权日2003年9月30日
发明者埃里克·莱斯库埃, 弗拉迪米尔·格鲁齐德夫 申请人:扎鲁纳股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1