Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1351396
  • 博文数量: 370
  • 博客积分: 10654
  • 博客等级: 中将
  • 技术积分: 4396
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 15:44
文章分类

全部博文(370)

文章存档

2012年(36)

2011年(195)

2010年(139)

分类: 虚拟化

2011-10-31 17:35:48

     裸机操作系统的启动需要从硬件EEPROM(电可擦写只读ROM)中的BIOS获取一些基本的硬件信息(如显卡模式,内存容量,硬盘参数等)。而BIOS本身提供了系统主要外部设备的基本驱动,可以直接访问一些基本的外部设备。
       显然Xen不允许Guest OS直接访问BIOS。因为GuestOS启动是在保护模式下进行的,那时整个系统的内存初始化工作已经完成,因此可以通过内存页的方式向Guest OS提供这部分硬件信息成为可能。在Xen中,BIOS被3种不同的形式共同取代,向Guest Os提供等同于BIOS的信息。
     在Xen源码中的位置/xen/include/public/xen.h
        一、启动页:包含Guest OS初始化内核所必须的一些基本的硬件信息,在Guest OS启动,或者从挂起状态恢复过程中传递给Guest OS。
             结构如下:在/xen/include/public/xen.h中

                 struct start_info {
                   char magic[32];             /* "xen-版本号-平台".字符串   如Xen-3.1-x86_32p   */
                   unsigned long nr_pages;     /* Xen分给Domain的内存页面数.  */
                   unsigned long shared_info;  /* 共享信息页的机器物理地址. */
                   uint32_t flags;             /* Domain设置的选项标志位,以SIF_开头               */
                   xen_pfn_t store_mfn;        /*  共享页面的机器物理页号.    */
                  uint32_t store_evtchn;      /* XenStore通道的事件通道. */
                  union { //控制台相关的数据
                       struct {//对于domU来说
                              xen_pfn_t mfn;      /*  控制页面的的物理页号 */
                              uint32_t  evtchn;   /* 控制页面的事件通道.        */
                         } domU;
                       struct {//对于dom0来说
                             uint32_t info_off;  /* 控制结构的偏移量.         */
                             uint32_t info_size; /* */
                         } dom0; 
               } console;
             /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME).     */
              unsigned long pt_base;      /* Domain Builder 生产的页目录的虚拟机地址.     */
              unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames.       */
              unsigned long mfn_list;     /* VIRTUAL address of pag.    */
              unsigned long mod_start;    /* VIRTUAL address of pre-loaded module.  */
              unsigned long mod_len;      /* Size (bytes) of pre-loaded module.     */
              int8_t cmd_line[MAX_GUEST_CMDLINE];     //控制台信息组
              /* The pfn range here covers both page table and p->m table frames.   */
              unsigned long first_p2m_pfn;/* 1st pfn forming initial P->M table.    */
              unsigned long nr_p2m_frames;/* # of pfns forming initial P->M table.  */
    };
     typedef struct start_info start_info_t;


     二、共享页:包含与CPU状态相关的基本信息,主要用于在Guest OS运行过程Xen和Guest OS之间的共享。

           struct shared_info {
                      struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS];   //VCPU信息结构体数组

    
                     unsigned long evtchn_pending[sizeof(unsigned long) * 8];  //事件通道相关标志位数组
                     unsigned long evtchn_mask[sizeof(unsigned long) * 8];     //事件通道相关的标志位数组

    
                    uint32_t wc_version;      /* Version counter: see vcpu_time_info_t. */
                    uint32_t wc_sec;          /* Secs  00:00:00 UTC, Jan 1, 1970.  */
                    uint32_t wc_nsec;         /* Nsecs 00:00:00 UTC, Jan 1, 1970.  */

                     struct arch_shared_info arch; //体系结构相关的结构,在/xen/include/public/arch-x86/xen.h 中定义

               };
           #ifndef __XEN__
           typedef struct shared_info shared_info_t;
            #endif

          struct vcpu_info {
                  uint8_t evtchn_upcall_pending;   //标志位,由Xen设置,若非0则表示存在未处理的事件,如为1表示存在未处理的时
                  uint8_t evtchn_upcall_mask;       // 标志位,若设置为非0,则表示屏蔽VCPU中断
                  unsigned long evtchn_pending_sel; //可以看作evtchn_pending选择符,表示该未处理的Event Channel在shared_info结构中的evtchn_pending数组中所在的 位置。
                  struct arch_vcpu_info arch;             //VCPU体系结构信息
                  struct vcpu_time_info time;             //VCPU时间相关信息
         }; /* 64 bytes (x86) */
       #ifndef __XEN__
      typedef struct vcpu_info vcpu_info_t;
      #endif
三、XenStore:一个与传统操作系统的文件系统相似的树形结构,用于存储一些设备信息和与Domain相关的其他信息(如各个虚拟机的配置信息)。


      在机器加电后,BIOS会对硬件设备进行一次彻底的检测,即加电自检。BIOS自检完成后,会对硬件设备进行初始化,保证所有的在IRQ(中断请求)和I/
O端口操作时没有冲突。BIOS的这一部分功能是由启动信息页和XenStore共同完成的。为了能够尽早使用控制台设备,将控制台设备的信息保存在启动信息页中,在Guest OS内核启动时加载。其他设备的信息则保存在XenStore中。

 

 

(注:启动信息页和共享信息页时通过共享内存内存页来实现的)

阅读(1902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~