设为首页 收藏本站
查看: 1289|回复: 0

[经验分享] Xen的体系结构

[复制链接]

尚未签到

发表于 2015-4-13 14:05:18 | 显示全部楼层 |阅读模式
1. BIOS的虚拟化
  xen的启动过程,与x86系统一样,首先要进入保护模式,然后安装中断处理程序。
  xen的中断处理程序可以分为几种,有的是直接分发给正在运行的操作系统,有的是分发给安装了硬件驱动的Dom0。以时钟中断为例,既要分发给xen本身,用来调度各个Guest系统的运行,又要分发到运行的Guest中,支持Guest内部的程序调度。
  
BIOS的支持
  x86系统在启动过程中需要读取BIOS提供的信息,同时也能使用BIOS提供的调用来对硬件进行直接操作。
  这种机制,xen不会提供给Guest,因为它破坏了“Isolation”的原则。
  因此,xen通过一种start info page来向Guest提供启动所需的有关BIOS的信息。
  
  类似的机制还有:
  1). shared info page: 用来在Guest运行的时候可以动态地更新共享的数据。
  2). XenStore: 用来确定哪些虚拟的设备是可以使用的。
  
  xen使用的是虚拟设备,因此对于DomU的虚拟机来说,只需要实现一种需要的driver就好了。
  
2. Xen的特权级处理
  Xen在支持4个特权级别的体系结构中,处于0特权级别,操作系统处于1特权级,而应用程序处于3特权级。
  在支持2个特权级别的体系结构中,处于0特权级别,而让操作系统和应用程序一同处于1特权级别。
  
  总而言之,Xen一定要接管最高的特权级别,而操作系统的代码则不允许像原来一样可以执行所有的指令。
  操作系统执行特权指令时,会抛出General Protection异常。
  
  xen的处理逻辑是,由Guest操作系统负责保证,它自己不会执行任何特权级0的专属指令,而会将其替换成hypercall,传递给xen,从而保证这些指令都能够被妥善地处理。
  
3. hypercall的实现
  在xen 3及以前,hypercall是通过类似于系统调用的方式实现的,系统调用使用的是0x80号中断,而hypercall使用的是0x82号中断。
  现在已经用一种新的机制替换了,这就是hypercall page。
  hypercall page是映射到操作系统内存空间的一个内存页,Guest操作系统调用这个内存页中的一个地址,就可以完成hypercall的调用。
  


   1: #define _hypercall1(type, name, a1)                    \   2: ({                                    \   3:     __HYPERCALL_DECLS;                        \   4:     __HYPERCALL_1ARG(a1);                        \   5:     asm volatile (__HYPERCALL                    \   6:               : __HYPERCALL_1PARAM                \   7:               : __HYPERCALL_ENTRY(name)                \   8:               : __HYPERCALL_CLOBBER1);                \   9:     (type)__res;                            \  10: })  做一些翻译处理后




   1: #define _hypercall1(type, name, a1)            \           2: ({                                    \   3:     register unsigned long __res  asm("eax");        \   4:     register unsigned long __arg1 asm("ebx") = __arg1; \   5:     register unsigned long __arg2 asm("ecx") = __arg2; \   6:     register unsigned long __arg3 asm("edx") = __arg3; \   7:     register unsigned long __arg4 asm("esi") = __arg4; \   8:     register unsigned long __arg5 asm("edi") = __arg5; \   9:     __arg1 = (unsigned long)(a1);                      \   10:     asm volatile ("call hypercall_page+%c[offset]"     \                11:               : "=r" (__res), "+r" (__arg1)            \     12:               : [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0]))            \  13:               : "memory", "edi", "esi", "edx", "ecx");                \  14:     (type)__res;                            \  15: })  比较奇怪的语法为%c[offset],表示的是名为offset的常量,参考http://stackoverflow.com/q/1672900/941650
  因为通常一页有4KB大小,




   1: extern struct { char _entry[32]; } hypercall_page[];  而hypercall_page是包含32bytes的结构体,因此4KB可以保存128项hypercall




   1: ENTRY(hypercall_page)   2:     .skip PAGE_SIZE

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-56718-1-1.html 上篇帖子: How to set up Xen DomU as Windows 2008 Server on a CentOS Dom0 machine? 下篇帖子: xen虚拟机管理命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表