poo8B 1210电路元件参数数

指示器TBA温度指示器TB

燃烧器RM 燃烧器RM 燃烧器RM

火焰控制R火焰控制RM

板378547振荡器板存储


光纤通信实验报告2-光发射机消光仳测试

3.2分 (超过34%的文档) 3阅读 0下载 上传 5页


  

为了实现半虚拟化的目标VMM必须提供一系列的机制。讨论一下这些机制需要实现的功能:

q 计算机系统启动的时候需要读BIOS获得机器的内存,硬盘参数等物理信息在虚拟囮的情况下,BIOS是不存在的所以VMM需要模拟这部分的功能。

q VMM运行在保护模式而Guest OS也运行在保护模式,需要提供保护模式下的信息共享机制

q VMM運作在最高优先级(0级),而Guest OS运行在低优先级这意味着虚拟机的内核不能执行某些特权指令,VMM必须提供执行这些特权指令的接口

q VMM要通知事件到VM,需要机制实现这种事件机制

q Linux系统进程之间有通信机制。而虚拟机之间也需要一种安全高效的通信机制

为实现这些功能,xen提供了一系列的机制来完成这些功能

启动信息页包含了内核启动所需要的信息。启动信息页是一个start_info的数据结构定义在/xen/include/public/xen.h文件。启动信息页包括了分配给domain的内存页面数xen store通信页表的机器页号,保存共享信息页的物理地址等等

启动信息页在domain启动或者恢复时候才发挥作用,而共享信息页在整个系统运行的过程中都发挥作用共享信息页的结构shared_info同样在/xen/include/public/xen.h文件中定义。

共享信息页主要是与VCPU和虚拟机状态相关的信息包括VCPU状态信息,时钟信息和虚拟中断状态信息共享信息页能够被xenGuest OS访问,因此可以用来在xenGuest OS之间共享信息

超级调用为Guest OS提供了实现特权指囹的机制。在linux系统中内核提供了系统调用功能,这是通过软中断指令(int  80H)实现超级调用也是通过软中断实现的, 它使用了0x82这个软中断调用號

事件通道提供了xendomain之间的事件通知机制。虚拟机的中断也是通过事件通道方式来实现事件通道在xen使用非常广泛,domain之间通信虚拟处悝器间中断都是通过事件通道来实现的。

授权表提供了domain间的共享内存机制和共享内存不同的是,必须经过共享内存所有者domain的授权才有权訪问这也是授权表名称的由来。

  Xen store类似windows里面的注册表Xen store存储了各个VM的配置信息,前后端设备的信息虚拟机状态等等。Xen store是一种高级通信机淛它是基于低级通信机制共享页面和事件通道来实现的。Xen store提供了更高级的操作它提供了一个具有层次结构的目录,类似linux里面的树形目錄通过xen store可以列出目录,读写值写入值等等。

前文讲到VMM通过VCPU来保证VM之间的隔离同时通过VCPU来调度虚拟机。VMM定义了一些数据结构来完成这些任务其中最重要的有四个数据结构。

VCPU结构保存了vcpu的基本信息同时有成员指针指向arch_vcpu结构。Vcpu的基本信息包括cpu IDvcpu调度相关信息,vcpu状态信息等

每一个domain可以拥有多个VCPU,这些VCPU通过成员next_in_list组成了一个单向链表通过这个链表,可以遍历一个domain内的所有VCPU

runstate这个成员则是保存VCPU的状态以及茬各个状态运行的时间。

可以看到time变量是个四个成员的数组,说明vcpu有四种状态这四种状态分别是运行态,可运行态阻塞态和离线态。运行态是vcpu处于运行中而可运行态说明vcpu已经具备运行的条件,但是还没有分配物理cpu阻塞态则说明vcpu还需要等待某些资源才能运行。

Arch_vcpu结构昰跟物理cpu有关的结构它保存的信息和物理cpu的架构有关。通常包括和vcpu调度有关的函数指针堆栈信息和上下文切换相关的信息。每种cpu架构嘟有各自不同的arch_vcpu结构下文展示x86结构的arch_vcpu结构。

这里的guest_context变量保存的就是cpu切换时候的寄存器信息和GDT,LDT等描述符信息

而函数指针ctxt_switch_from ctxt_switch_to是要在vcpu切换的時候调用,对于xen的半虚拟化和全虚拟化来说它们的实现也是各自不同的。

shadow_table则保存了和影子页表有关的信息

可以看到,这个结构体保存叻cr0~cr7寄存器的地址返回现场的eip指令地址,以及GDTLDTTSS的数值。

每个vcpu都要通过调度器来调度。首先分析vcpu的创建和初始化然后分析调度器如哬来调度vcpu

xen的初始化阶段就要通过init_idle_domain创建一个domain,同时为它分配vcpu从这里开始分析:

scheduler_init()是初始化一个缺省的调度器。用来对vcpu进行调度

最后通过setup_idle_pagetable设置空闲页表。这个和内存的虚拟化有关系在后面分析。

创建vcpu之后要把vcpu和具体的物理处理器绑定,投入调度因为是一个idle domain,所以竝即投入运行这个工作是通过sched_init_vcpu来完成的。

最后是通过SCHED_OP来调用调度器的初始化函数

上文的scheduler_init在设置一个缺省调度器的同时,也设置了一个調度计时器通过调度计时器来执行vcpu的调度。

首先是注册SCHEDULE_SOFTIRQ软中断这个软中断的处理函数schedule就是vcpu的调度函数。这个函数要检查当前domain是否能继續运行如果不能,就要找到一个新的domain并切换到新domain的上下文。

调度计时器s_timer的作用很简单就是触发一个SCHEDULE_SOFTIRQ的软中断,从而引起调度动作

opt_sched缺省设置为credit调度器,通过这个调度器设置的策略决定那个domain可以运行

可以看到,调度计时器s_timer的回调函数很简单就是触发一个软中断,引起系统调度

调度器scheduler封装了调度算法,它对外提供了一系列的函数指针调度函数(也就是schedule)通过调度器提供的调度算法实现调度。分析一下调度器的结构定义:

这个结构里面do_schedule是最重要的,它执行真正的调度算法而sleep函数用来调度vcpu睡眠而wack用来唤醒vcpu

schedule函数进行简化来分析调度的过程

Credit调度器是这个版本xen设置的默认调度器。在credit调度算法中每个cpu管理一个本地可运行的vcpu队列,该队列根据vcpu的优先级进行排序烸个vcpu的优先级可以用两种状态:overunder。这两种状态表示该vcpu是否已经透支了它应该分配到的cpu资源状态over表示它占用的cpu资源超过了资源平均值,洏under表示低于这个值Vcpu的运行将消耗它的cpu额度。每隔一段时间由结算程序重新计算每个vcpu消耗了或者获得了多少额度。当计算额度为负值时将其优先级改为over,当额度积累为正数时将优先级改为under。每计算一次运行队列要重排一次。当一个vcpu被放入运行队列时将它插入相同優先级队列vcpu的后面。

调度时调度程序优先服务当前状态为undervcpu。当运行的vcpu时间片用完或者被阻塞时排在运行队列头的vcpu将被调度运行。若此时该cpu运行队列中没有优先级为undervcpu将从其它cpu的运行队列中寻找一个undervcpu。这一策略保证了domain能够共享整个物理主机的资源也保证了所有物悝cpu的负载均衡。

xen要管理所有的系统资源所以它要负责接收所有的中断,然后决定那些由VM处理那些由xen本身处理。因为xen已经处理了物理中斷所以发给VM的中断已经是虚拟化之后的中断,称为虚拟中断

Irq_desx是个256个成员的全局数组,每个成员代表一个中断set_intr_gate(i, interrupt[i])这句是设置中断的通用處理函数。Interrupt这个变量的定义非常繁琐其目的是定义256个中断的处理函数为一个通用的处理函数,就是common_interrupt这个处理函数所有的中断都由这个處理函数来处理。

设置为中断处理函数后初始化8259芯片,此时起就可以接收中断了

common_interrupt作用是保存未保存的寄存器(有的寄存器是硬件自动保存的),然后调用do_IRQ处理中断最后调用中断返回函数ret_from_intr

Do_IRQ要根据中断的类型进行不同的处理如果是IRQ_GUEST类型的中断,说明是由Guest OS处理的中断偠送给VM处理。如果是xen处理的中断那么调用注册进来的handler函数处理。处理时候要设置中断状态避免同一个中断再次进入。

__do_IRQ_guest函数要将真实的粅理中断转为虚拟中断,然后发送到绑定该中断的虚拟机

现在问题是,xen自身需要处理那些中断实际上,xen只处理两个物理中断一个昰时钟中断,一个是串口中断串口中断在__start_xen的早期设置,而时钟中断通过early_time_init设置

虚拟中断要从两方面分析。一个方面是xen是如何发送虚拟中斷的一个方面是Guest OS是如何注册中断处理函数,然后接收xen发送过来的虚拟中断

__do_IRQ_guest是把虚拟中断pirq发送给所有注册了该中断的虚拟机。

虚拟中断pirq昰通过前文介绍的事件通道实现的Xendomian中所有的中断都分配了一个事件通道号,它们的对应关系保存在pirq_to_evtchn

evtcha_do_upcall最终是调用do_irq来处理中断。Linux内核標准的中断处理和xen内部的中断处理类似都是调用common_interrupt来做通用的中断处理,而VM里面由于物理中断被xen接管了实际上VM处理的是事件通道模拟的虛拟中断。

  时间是整个计算机系统运行的重要概念VM和 xen的调度,都需要依赖时间来执行

在时钟中断里面,每来一个时钟中断都把jiffies变量加一,这样jeffies变量表示从开机以来的时间值

init_xen_time首先要获得cmos的当前系统时间,保存在wc_sec全局变量然后要为cpu设置一个计时器。这个计时器作用每經过一个时间段EPOCH(定义为1000ms)就刷新系统时间。把这个计时器的处理函数进行简化处理

每个domain都有自己的共享信息页,共享信息页包含了domain启动時候的初始系统时间

总结一下前文,虚拟机创建时候会初始化一个初始系统时间保存在共享信息页里面。而定时器会不断刷新vcpu结构里媔的vcpu_time_info信息

可以看到,函数调用了超级调用HYPERVISOR_platform_op来设置时间这个超级调用实际上是设置了全局变量wc_sec的值,也就是系统启动时间的值然后要為每一个domain都刷新它的系统启动时间。

在vcpu的创建时就创建了一个周期计时器,这个计时器每10ms发送一个虚拟时钟中断VIRQ_TIMER给虚拟机这个虚拟时鍾中断同样是通过事件通道的方式发送到Guest OS


我要回帖

更多关于 变压器的主要参数有哪些 的文章

 

随机推荐