Xen的共享信息页(Shared Info Page)
1. 共享信息页(Shared Info Page)概述
启动信息页(Start Info Page)只在Domain启动或恢复时才被更新,且启动信息页由Domain Builder在Domain启动时映射到内存空间中。而共享信息页(Shared Info Page)在Domain整个运行过程中,都可以被Xen和Guest OS访问更新,可以用来在Xen和Guest OS之间共享和传递信息,主要收集与VCPU和虚拟机状态相关的信息,其中包括VCPU状态信息,时钟信息和事件通道(虚拟中断)状态信息等,且共享信息页是由Guest OS自己将其映射到内存空间中的。
2.共享信息页的结构
2.1 共享信息页的结构体定义
struct shared_info {
/*与VCPU信息相关, XEN_LEGACY_MAX_VCPUS=64*/
struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS];
/*与事件通道相关*/
unsigned long evtchn_pending[sizeof(unsigned long) *8];
unsigned long evtchn_mask[sizeof(unsigned long)*8];
uint32_t wc_version;/*当前挂钟版本计数器*/
uint32_t wc_sec; /*当前挂钟时间(秒)*/
uint32_t wc_nsec;/*当前挂钟时间(纳秒)*/
/*与系统体系结构相关信息*/
struct arch_shared_info arch;
};
#ifndef __XEN__
typedef struct shared_info shared_info_t;
#endif
2.2 结构体struct shared_info的结构示意图
3 结构体shared_info的成员字段说明
evtchn_pending和evtchn_mask数组都与事件通道相关。在Xen系统中,每个事件通道都有一对(pending,mask)标志位与之相对,而evtchn_pending和evtchn_masking数组就用来保存这些pending和mask标志位,其中pending标志位表示与其对应的事件通道中有未处理的事件通知,只能由Xen设置,由Guest OS清除;mask标志位用来屏蔽该事件通道的事件通知,只能由Guest OS进行更新。由于pending或mask标志位仅需要1bit表示,所以在x86_32平台上,Domain所分配的事件通道个数为
(unsignedlong)*(sizeof(unsigned long))*8=1024
(2)wc_version,wc_sec和wc_nsec
wc_version, wc_sec和wc_nsec都与系统时间(SystemTime)相关。其中,wc_version为挂钟版本计数器,wc_sec和wc_nsec都表示挂钟的当前时间,分别是秒级和纳秒级。在Xen系统中,主要有两类时间,一类是系统实际时间,一类Guest OS虚拟时间。
(3)arch
struct arch_shared_info结构体arch用于保存与体系结构相关的信息,其中max_pfn表示P2M表中出现的最大物理页框号(Physical Frame Number, PFN),pfn_to_mfn_frame_list_list则表示包含P2M表的页框列表的页框机器地址,nmi_reason用来记录发生非屏蔽中断(NonMask Interruption, NMI)的原因,其结构定义如下所示:
struct arch_shared_info {
unsigned long max_pfn;
xen_pfn_t pfn_to_mfn_frame_list_list;
unsigned long nmi_reason;
uint64_t pad[32];
};
(4) vcpu_info
vcpu_info保存与VCPU状态相关的信息,vcpu_info数组中的每个成员对应一个分配给Domain的VCPU,在vcpu_info的每个成员中,evtchn_upcall_pending由Xen设置,若非零表示vcpu存在未处理事件;evtchn_upcall_mask由Guest OS设置,若设为非零,其将使该VCPU屏蔽所有事件通道, evtchn_pending_sel可以看做evtchn_pending数组的选择符(selector),若第10个(端口号为9)事件通道中存在未处理的事件通知,则evtchn_pending_sel的第一位被设置为1,表示在端口号为0-31组成的一组事件通道中存在未处理的事件通知。