虚拟化服务层提供支持分区半虚拟化所需的内核服务,并通过超级调用提供给分区使用。其中一些服务也可以被PRTOS中的其他模块使用。虚拟化服务层包含虚拟中断服务、虚拟时钟和虚拟定时器服务、虚拟内存管理服务、虚拟设备管理服务、健康监控管理服务、虚拟处理器调度服务、分区管理服务、分区间通信服务、超级调用派发服务以及跟踪管理服务共10个组件。
PRTOS向分区提供启用/禁用、屏蔽/解除屏蔽两类虚拟中断服务。与硬件平台类似,有些中断是不能被禁用的,比如系统重置异常。
1)启用/禁用虚拟中断:启用虚拟中断意味着当前vCPU将响应触发虚拟中断的事件,而禁用虚拟中断则意味着当前vCPU不做出响应,有助于vCPU控制其对外部事件的响应。
2)屏蔽/解除屏蔽虚拟中断:类似于启用/禁用服务,屏蔽虚拟中断将暂时阻止vCPU响应指定类型的事件,而解除屏蔽虚拟中断则允许vCPU重新响应。这种机制可以暂时阻止vCPU对某些事件的处理,待需要时再恢复处理。
综上所述,PRTOS允许分区内的应用程序动态地管理其对虚拟中断事件的响应。这种灵活性可以用于优化分区内部的任务调度、时间管理和系统响应等。
PRTOS为每个分区构建了一个虚拟中断表,存储了虚拟中断号与分区内中断处理程序的映射关系。每个分区可以实现分区内部的中断处理函数。客户操作系统在分区中所看到的虚拟中断与硬件平台提供的中断基本类似。
1)分区虚拟中断表:是一个数据结构,用于将虚拟中断号与对应的中断处理程序关联起来。在虚拟化环境中,多个分区共享硬件资源。PRTOS若要处理中断事件并正确地投递各个分区的中断处理程序,则必须建立中断机制。分区虚拟中断表就是这类中断机制的关键部分。
2)定义中断处理程序:每个分区可以在其虚拟中断表中定义与分区内部事件关联的虚拟中断号,并指定中断处理程序。当分区内部事件触发时,分区应用会查找虚拟中断表,根据虚拟中断号调用中断处理程序。
时钟和定时器是分区中重要的虚拟设备,基于虚拟中断实现。接下来我们分析虚拟时钟和虚拟定时器服务。
PRTOS为分区提供了访问虚拟时钟和虚拟定时器的服务,呈现全局时钟和本地时钟的视图,以帮助分区控制任务执行时间。
(1)虚拟时钟
虚拟时钟是客户操作系统用来追踪时间的虚拟设备。客户操作系统通过超级调用服务读取虚拟时钟的计数值。PRTOS提供了两种不同类型的时钟:全局时钟和本地时钟。
1)全局时钟:是一个系统级别的时钟,用于追踪PRTOS的整体运行时间,在整个PRTOS系统范围内进行计时,不受分区执行状态的影响,为分区提供了一个可以用来测量系统性能、计算时间间隔和时间戳的标准时间源。无论分区是否执行,全局时钟都会持续计时。
2)本地时钟:是与分区执行状态相关联的时钟,为每个分区提供一个独立的定时器。只有在分区执行时,本地时钟才会计时。一旦分区被挂起或被切换,对应的本地时钟将暂停计时,待分区恢复运行后再继续计时。
(2)虚拟定时器
虚拟定时器是用来设定周期性或单次定时事件的虚拟设备。PRTOS提供了两种不同类型的定时器:全局定时器和本地定时器。
1)全局定时器:该定时器与全局时钟同步,不受分区的执行状态的影响,适用于需要在整个系统范围内触发的任务。
2)本地定时器:与每个分区的本地时钟同步,只有当分区处于执行状态时才会定时,适用于需要在分区内部执行的任务。
这两类定时器都可以被设置为单次触发模式和周期性触发模式。
1)单次触发模式:该模式下的定时器只触发一次就停止定时,适用于只执行一次的任务。
2)周期性触发模式:该模式下的定时器在设定的周期内反复触发,适用于重复执行的任务。
(3)虚拟时钟和虚拟定时器提供的服务
PRTOS提供的虚拟时钟和虚拟定时器可为分区应用提供以下3种服务。
1)虚拟时间查询:查询当前分区时间,以获取时间戳或计算时间间隔。
2)定时器管理:支持分区内应用程序的创建、配置;管理定时器,包括设置定时器触发的时间间隔和触发模式等。
3)设定定时器回调函数:当虚拟定时器触发时,PRTOS会自动执行回调函数,使得应用程序执行预定的操作。
PRTOS为分区提供访问虚拟时钟和虚拟定时器服务的目的是保证分区任务的实时性和可预测性。
PRTOS借助硬件MMU,使分区只能访问PRTOS系统配置文件分配给它的内存空间。绝大多数的客户实时系统不处理MMU页表,GPOS(如Linux)等其他客户必须动态地填充页表。
1)MMU是一种硬件组件,用于管理系统中的物理内存和虚拟内存之间的映射关系。它允许操作系统和应用程序将虚拟内存地址映射到物理内存地址,实现内存的隔离、保护和有效利用。
2)PRTOS系统配置文件是一种用于描述系统配置的数据结构,包含每个分区被分配的内存空间的范围信息,包括起始地址、大小等。PRTOS使用这些配置信息来告知硬件MMU如何设置内存映射,以使每个分区只能访问其分配的内存空间。
通过使用硬件MMU,PRTOS可以在硬件级别上限制每个分区只能访问为其分配的内存空间,从而提高了系统的隔离性,并能够检测分区的非法内存访问,从而提高了系统的安全性和可靠性。
PRTOS的虚拟设备管理服务可以分成两类。
(1)虚拟控制台管理虚拟串行设备
虚拟控制台用于PRTOS内核和分区输出运行状态信息。PRTOS通过虚拟控制台将物理串行通信设备(例如UART、VGA设备)模拟为多个虚拟串行设备,以供内核和分区使用,使得内核和每个分区都可以拥有自己的虚拟串行设备,而实际的物理设备则由PRTOS透明地映射到这些虚拟设备上。
(2)系统配置表将其他设备分配给分区
PRTOS并不直接操作和控制除串行设备外的其他硬件设备,而将操作和控制硬件设备的责任交给各个分区,由分区与所分配的设备进行交互,从而实现特定的功能。
PRTOS通过系统配置表为分区分配外围设备,确保分区独占资源。配置表包含分区可访问设备的信息。启动时,PRTOS根据配置信息将设备分配给分区,确保资源的安全可控,防止未经授权的访问和资源发生冲突。
同时,PRTOS通过配置文件将设备所属的硬件中断也分配给分区,并且只允许配置文件中指定的分区来管理设备中断。特定设备触发的中断事件仅由一个特定的分区来管理。当该设备触发中断时,只有被分配为管理该设备中断的分区才会响应和处理这个中断,其他分区将被禁止干预这个中断。
这种中断分配和管理策略确保了中断处理的独占性和可控性。每个设备中断都有唯一的管理分区,并且只有在配置文件中明确指定的分区才能够处理该中断。这有助于避免资源冲突和混乱,同时提供了更可预测的系统行为。
健康监控用于检测系统或者分区的异常事件、状态,并做出反应。健康监控的目的是在错误发生的早期阶段试图解决错误,或者将错误限定在发生故障的子系统,目的是避免或者减少可能的损失。
(1)健康监控的触发机制
PRTOS具备处理处理器陷阱的功能。当系统中发生错误指令导致处理器陷阱时,PRTOS会检测并确定生成错误的责任方是谁(例如应用程序、操作系统等),然后执行与该错误相关的操作。每个错误所需执行的操作定义在配置文件中,这使得系统可以根据配置来处理不同类型的错误。这种机制有助于确保系统在发生错误的情况下进行适当的处理,以保证系统的稳定性和可靠性。通过在配置文件中定义错误操作,系统管理员也可以灵活地定义系统在发生错误时的行为,以适应不同的需求和优先级。
(2)健康监控的管理机制
PRTOS对故障采取简单操作。这些操作可能是忽略错误、将错误传播到故障分区、停止故障分区、重置故障分区、停止系统或重置系统。处理这些故障和错误的方式通常根据系统的要求和特定情况来选择。选择何种操作取决于故障的类型、优先级、影响范围等因素。在实时系统中,对于故障的快速响应和处理非常重要,以确保系统的稳定性和可靠性。
PRTOS会捕获和处理处理器架构支持的异常情况,然后根据其配置和策略采取适当的操作,如错误处理、故障管理等。这种行为可确保PRTOS充分利用处理器提供的异常处理机制,并根据应用程序的实时性要求来处理可能发生的异常情况,以维护系统的稳定性和可靠性。在分区或PRTOS执行过程中,由软件检测到的错误通过健康监控事件通知给健康监控子系统。健康监控事件将启动分配给特定错误的健康监控操作,比如分区代码检测到的错误应在分区级别处理。PRTOS提供健康监控事件机制,与故障相关的操作将按照配置文件中定义的方式执行,以维持系统的稳定性和可靠性。
(3)健康监控的日志维护
对性能、可靠性、安全性等要求非常高的关键系统,需要由特定分区进行验证。为了维护健康监控事件的历史记录,PRTOS提供了一个日志系统。PRTOS负责维护由健康监控系统生成的事件日志,这些事件日志包括系统的状态变化、故障情况等,会存储在配置文件指定的内存区域中,以便日后分析和审查。通过维护事件日志,系统可以更好地了解系统运行情况,进行故障排查和分析,以增加系统的可靠性和透明性,同时满足关键系统的要求。
PRTOS为每个分区提供了vCPU,每个vCPU都是pCPU的抽象。PRTOS提供的vCPU旨在模拟pCPU的行为,并提供尽可能接近pCPU的性能。PRTOS按照事先定义的循环表调度策略调度vCPU的执行。调度策略由一系列时间槽组成,每个时间槽将分配给分区中的一个vCPU。
每个pCPU执行一个独立的调度策略,pCPU会根据配置的调度策略来决定哪个vCPU在何时运行。通过在不同调度策略之间的切换,PRTOS可以有效地适应不同的应用需求,从而提高系统的整体性能和资源利用率。与此同时,PRTOS还提供了允许系统分区切换不同调度策略的超级调用服务。调度策略的切换在当前调度策略执行的末尾执行,以确保平稳地切换,避免资源冲突和混乱。
由于每个pCPU都有专属的调度策略,单pCPU的硬件平台只是多pCPU硬件平台的特例,因此对PRTOS内核调度器来说没有差别。循环表调度策略有助于确保每个分区得到适当的资源分配,避免资源竞争和冲突。
分区是一个包含应用的执行环境。从PRTOS的角度来看,分区是应用的容器,由PRTOS负责管理,并提供分区虚拟化服务。根据配置文件的要求,PRTOS会提供给分区一个或者多个vCPU。vCPU包括一组分区可直接访问的处理器寄存器、1个栈空间、2个时钟(全局和本地)、2个定时器(基于全局时钟和本地时钟),以及必要的虚拟硬件资源(比如虚拟串行设备)。
(1)分区启动
从PRTOS的角度来看,分区是具有单一入口点的一段代码。这段代码代表了一个独立的执行空间,在其中可以运行一个应用程序、任务或特定功能。这个单一的入口点是分区内部的起始执行位置。当分区被调度执行时,系统将从这个入口点开始执行分区内的代码。
当分区启动的时候,PRTOS会调用分区入口代码,这和非分区系统在重启过程中调用启动代码片段的工作方式是类似的。在启动过程中,无论是分区系统还是非分区系统,都需要执行特定的代码来准备系统环境并开始执行任务。分区系统中的分区入口代码与非分区系统中的启动代码在作用上是类似的,都是为了确保系统正确启动并开始执行任务。
(2)分区的任务
不管是运行客户操作系统的分区,还是运行裸机应用的分区,都要负责建立内部代码运行机制,包括以下6个任务。
1)每个执行环境都需要一个栈来管理函数调用、局部变量等。分区需要负责分配栈内存,并在代码执行过程中适当地管理栈空间。
2)中断是处理器响应硬件事件和异常情况的重要机制。分区需要设置虚拟中断表,以确保在发生中断时能够正确地跳转到相应的中断处理程序。
3)分区需要分配CPU时间片、内存和其他资源,以确保分区内的代码可以顺利运行,而不会与其他分区发生冲突。
4)分区开始执行之前需要初始化寄存器、设置初始状态等,这有助于确保代码在正确的环境中运行。
5)如果分区需要处理中断,它必须设置中断处理函数,以便在中断发生时正确地响应和处理。
6)如果分区需要使用内存,它需要管理内存分配和释放以及处理可能的内存碎片问题。
以上任务是确保分区能够正常运行并与其他分区协调工作的基础。
(3)多vCPU分区支持
多vCPU分区将会从PRTOS收到vCPU0的(默认)使能状态,分区中的vCPU0负责启动其他vCPU,并分配资源运行多核应用,使多核应用能够在这些vCPU上并行运行。这种机制使得多处理器分区能够有效地协调和管理多核处理器的资源和任务,从而实现更高的性能和效率。
(4)分区管理
PRTOS提供了一组服务来管理分区。
1)PRTOS为分区提供了一组服务。通过这些服务,分区可以请求资源、进行配置、进行通信等。
2)通过PRTOS提供的服务,分区可以向PRTOS请求所需的虚拟化资源,例如分配特定的CPU时间片、内存容量等。
3)通过使用PRTOS提供的服务,虚拟化环境可以确保各个分区之间的资源隔离和安全性,防止资源冲突和未经授权的访问。
PRTOS为分区提供授权的通信服务。
1.分区通信的授权方式
分区通过系统配置文件定义的通信点进行通信。通信点是指分区用于与其他分区进行通信的端口,分区可以通过这些端口发送和接收数据。每个端口都用一个名称进行标识,这个名称可以用来唯一地识别特定的通信接口。分区并不知道连接到相同端口的其他分区是哪些。这种连接关系是在系统配置文件中定义的,这样的配置可以在PRTOS运行时为不同的分区分配不同的通信通道。通道是指不同分区之间进行通信的途径。通过定义端口和通信通道,不同的分区可以在不了解对方的情况下进行通信。为了确保系统的安全性和合规性,只有在系统配置允许的情况下,一个分区才能将数据发送给另一个分区,这种限制可以避免未经授权的通信。
这种方式确保了通信活动在预期的范围内进行,实现了分区间的安全通信,有助于维护系统的隔离性、安全性和可控性。
2.分区间的端口通信
PRTOS为分区提供了端口,用于实现分区间通信。端口通过配置文件指定给某个分区。
1)在PRTOS中,端口是用于分区之间通信的接口,允许分区发送和接收数据。
2)不同的分区需要在系统内部进行通信,以便共享数据、协调任务等。端口提供了这种通信的机制。
3)端口分为数据的源端口和目的端口。源端口用于发送数据,而目的端口用于接收数据。
3.分区间的异步通信
PRTOS提供的所有分区间通信都是异步的,这意味着在进行通信操作时,发送方和接收方之间的执行是相互独立的。在异步通信中,发送方将数据发送给通信通道或端口,然后可以继续执行其他任务。接收方可以在适当的时候从通信通道或端口中读取数据,并在需要时处理接收到的数据。
异步通信的特点是效率高,因为发送方和接收方可以并行执行任务,不会相互阻塞。然而,由于没有直接的同步机制,需要额外的处理来确保数据的正确性和一致性。
4.分区间通信的种类
PRTOS提供了非缓冲的采样通道和缓冲的排队通道,用于实现分区间通信的不同机制。这两种机制用来支持不同类型的通信需求。
(1)非缓冲的采样通道
非缓冲的采样通道用于实现异步通信,接收方周期性地从发送方读取数据。发送方在采样端口中写入数据,接收方则以固定的频率从采样端口中读取最新的数据。
采样方式包括广播、多播以及单播消息传递方式。这种模式不支持消息排队。消息在通过通道传递出去之前会一直停留在源端口,或者被新出现的消息覆盖。每一个消息实例到达目的端口后,都会覆盖目的端口的当前消息,并一直保留在那里,直到被新的消息覆盖。PRTOS采用这种方式可以确保目的分区在任何时间访问的都是最新的消息。
(2)缓冲的排队通道
缓冲的排队通道用于实现异步通信,允许发送分区将数据写入通道,然后继续执行自己的任务,而不需要等待接收分区读取数据。接收分区可以在适当的时候从通道中读取数据,而无须与发送分区实时同步。通道有一个缓冲区,允许在一定程度上解耦发送分区和接收分区,提高了通信的灵活性和效率。在这种基于队列的通信方式中,数据按照先进先出(First In First Out,FIFO)的顺序进行传输。发送方将数据写入排队端口,接收方则从排队端口读取数据。排队端口可以在分区间进行异步通信,发送方和接收方之间没有实时通信的要求。排队端口适用于需要缓存多个数据项并按照先后顺序进行传输的场景。
超级调用派发服务是PRTOS内核提供半虚拟化服务给分区使用的一种调用服务机制,用于处理PRTOS内核和分区应用之间的交互。超级调用派发的流程如下。
步骤1:分区应用通过Hypercall API发起超级调用,将控制权转移给PRTOS内核。
步骤2:PRTOS内核中的超级调用派发程序接收到请求后会判断是否为超级调用。
步骤3:如果是超级调用,超级调用派发程序将请求转发给对应的PRTOS内核服务程序。
步骤4:PRTOS内核服务程序完成处理后,将结果返回给超级调用派发程序。
步骤5:超级调用派发程序将结果返回给Hypercall API。
步骤6:Hypercall API将结果返回给分区程序,并将控制权转移回分区程序。
在超级调用派发流程中,超级调用派发程序的作用是根据请求类型将超级请求派发给相应的内核服务程序。因此,超级调用派发程序的实现需要高效、可靠,并具有一定的安全性能保障。同时,内核服务程序的实现也需要高效、可靠,以确保系统的可靠性和安全性。
提示: PRTOS提供给分区使用的超级调用服务程序在X86平台上是通过lcall指令完成的。该指令通过调用门实现了外层Ring 1/Ring 2/Ring 3对内层Ring 0门服务程序的调用。
跟踪日志指的是在软件开发和调试过程中生成的事件日志。这种日志会记录系统执行过程中的关键事件,以便开发人员在调试和分析中使用。跟踪日志对于识别问题、性能优化和理解程序行为都非常有帮助。
PRTOS负责维护由跟踪系统生成的事件日志,事件日志包括系统的状态变化、故障情况等。事件日志会存储在配置文件指定的内存区域中,跟踪管理子系统可用于存储和检索存放在指定内存区域中的、由分区和PRTOS内核产生的跟踪消息,以便日后分析和审查。通过维护跟踪系统事件日志,系统工程师可以更好地了解系统运行情况,进行故障排查和分析。