嵌入式实时Hypervisor:XtratuM (6)

第1章  XtratuM Hypervisor

Hypervisor通常由多个组件构成,客户操作系统管理器,用于创造、删除、监视客户操作系统;调度器,由于调度客户操作系统;中断管理,响应和处理硬件中断和陷阱;Hypercall, 处理由上层发送的同步服务请求,类似于操作系统中的系统调用;系统时钟管理器,为系统提供高精度时钟服务,对底层硬件时钟设备可以读写;虚拟时钟,为上层客户操作系统提供高精度时钟服务,但是由软件实现;域间通信,负责上层客户操作系统的数据传输等功能;虚拟内存管理器,管理虚拟内存,可以创建和是否虚拟内存以及映射和取消映射物理内存;物理内存管理器,管理系统物理内存;设备驱动模型,提供设备驱动的添加、删除等管理机制。面对如此多的功能组件,文章研究并没有涉及所有内容,只对中断管理、实时调度、虚拟内存管理、域间通信工具、驱动模型以及内核移植等几个方面展开论述和讨论。

1.1           系统结构

XtratuM Hypervisor位于Linux系统与底层硬件之间。运行于XtratuM系统上层的最小单位是域,作为XtratuM系统的一个可调度任务,Linux系统也是一个域。由于XtratuM的存在依附于Linux系统,因此,Linux系统在整个环境中被成为根域。运行于XtratuM Hypervisor上面的域也被称为客户域(与客户操作系统一样,但是包含简单任务)。图2-1给出了XtratuM系统结构图。

嵌入式实时Hypervisor:XtratuM (6)_第1张图片 

图2-1.          XtratuM Hypervisor系统结构图

从图2-1中可以清晰的看到,系统中与实时性能密切相关的中断、定时器等底层资源,由XtratuM进行直接管理,并采用虚拟技术,将这些资源进行虚拟化,通过软件的方式,提供类似硬件功能的软件设备,这些设备可以给客户域使用。通常虚拟中断或定时器的个数可以是多个或多套,因此,该结构可以保证每个客户域都具有一套完整的虚拟设备。关于XtratuM系统的虚拟定时器,可以参考[33]。通过对虚拟设备的封装,提供给上层域的是一系列封装接口,在Hypervisor系统中,我们称这些接口是Hypercall,它类似于操作系统中的系统调用,相关Hypercall的具体内容将在下一节介绍。

系统中,运行于XtratuM上层的域分为两种,一种是作为设备驱动的设备驱动域,另外一种是执行用户任务的应用域。设备驱动域,顾名思义是设备驱动程序作为被调度任务执行。在实时系统中,驱动程序作为实时任务,并可以被调度,这是一种更加便于管理的驱动模型策略。通过这种策略,系统可以更加方便的通过设定设备驱动域的优先级来设置设备的优先级。在XtratuM系统中,一切设备驱动域的优先级高于任何应用域的优先级。应用域与设备驱动域通过IDC(Inter-Domain Communication)工具完成数据的传输。

客户操作系统可以根据域内部任务的性质被分为两种不同类别。第一种是Linux系统为代表的非实时系统,但是其具有唯一性,第二种是以PaRTiKle为代表的实时系统。PaRTiKle系统是一个开源的线程实时操作系统,可以从[34]获取更多的信息。在XtratuM环境中,可以同时加载多个PaRTiKle实时系统或简单的实时域系统。第四章中会介绍如何编写自己的域。如图2-2所示,在PaRTiKle系统和Linux系统之间,可以通过FIFO或共享内存完成通信功能。

实时系统的任务是快速的获取数据并且给设备提供操作指令。通常,数据采集作业环境中,大量的数据获取必然迅速使用空间,为此,需要提供一个将数据迁移并转储到磁盘等大容量存储单元中是系统的解决方案。图2-2给出了数据采集系统的数据流图。实时任务获取数据,通过共享内存将数据传输给Linux,由Linux将数据写入磁盘。 这是系统使用FIFO或共享内存的一个典型环境,另外一种是人机界面控制系统,Linux系统提供用户控制界面,Linux接收到指令后,通过FIFO或共享内存将指令传输给PaRTiKle中的实时任务,实时任务根据指令对物理设备进行控制。图2-3给出了使用FIFO进行控制的系统模型。

 嵌入式实时Hypervisor:XtratuM (6)_第2张图片

图2-2.          共享内存的使用实例

                                                                                  

嵌入式实时Hypervisor:XtratuM (6)_第3张图片

图2-3.          FIFO的使用实例

1.2           中断管理

XtratuM Hypervisor系统中的中断管理主要涉及两个方面,第一个是物理中断的托管和虚拟中断表示方式,第二个是Linux系统中原有中断服务程序的处理。不同于通用操作系统,XtratuM Hypervisor基于Linux系统,当Linux系统启动后,XtratuM Hypervisor以模块的方式被加载并运行。XtratuM Hypervisor运行后的首要任务就是完成中断的托管,也就是由XtratuM重新设置中断向量表,当物理中断发生时,由XtratuM Hypervisor首先截获中断并做出响应。那么,XtratuM是如何做到的呢?

XtratuM被加载入Linux内核的时候,XtratuM模块会首先进入中断初始化模块,完成中断的的相应接管。在该部分,主要包含设置Linux的虚拟中断控制函数,Linux系统中断服务函数的保存,XtratuM中断服务函数的设置。在Linux系统中,当任务由用户模式进入内核态空间后,系统通过汇编指令屏蔽掉中断,禁止其它中断干扰系统执行。但是,当Linux作为应用域运行时,应允许底层中断的发生,为此,XtratuM要修改Linux系统的原有虚拟中断控制函数,保证在Linux在内核空间可以允许中断发生[35]

x86平台上,中断程序的控制是由CLISTI两个汇编指令控制,Linux系统进入中断上下文的时候将执行CLI指令,退出中断上下文的时候,系统通过STI允许中断。但是,为了改变Linux对底层硬件中断的直接开、关管理,XtratuMLinux建立了另外一套中断管理指令(或函数):

XM_root_func.__sti = vsti;

XM_root_func.__cli = vcli;

XM_root_func.__save_flags = vsave_flags;

XM_root_func.__restore_flags = vrestore_flags;

XM_root_func.__is_cli = vis_cli;

XM_root_func.__emulate_iret = emulate_iret;

    在每一个域里面,XtratuM模拟底层硬件结构,建立一个虚拟的FLAGS寄存器,上面这一系列函数就直接对这个虚拟FLAGS寄存器进行操作,完成对Linux相关的中断屏蔽、中断运行、中断标记保存与恢复等操作。

    XtratuM修改掉Linux相关中断管理指令后,XtratuM读取Linux原有的中断向量表首地址。在操作系统环境中,中断向量表被用来保存所有中断服务程序的入口地址,这些地址以数组的方式存放。当XtratuM获取到Linux原有的中断向量表后,XtratuM依次对Linux中断服务程序的首地址进行保存,从而可以让XtratuM安全的使用该中断向量表,将自己的中断服务程序添加到该中断向量表中,可以保证系统发生物理中断后,系统进入XtratuM系统中断服务程序。通常,XtratuM系统的中断服务程序作为分配器,选择不同的客户域为中断提供服务,图2-4给出了中断发生到最终进入Linux中断服务程序的流程图。

 嵌入式实时Hypervisor:XtratuM (6)_第4张图片

图2-4.          XtratuM Hypervisor系统中断响应流程图

 

你可能感兴趣的:(linux,汇编,嵌入式,任务,磁盘,linux内核)