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

Xen的体系结构的更多相关文章

  1. Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析

    Xen,VMware ESXi,Hyper-V和KVM等虚拟化技术的原理解析 2018年04月03日 13:51:55 阅读数:936   XEN 与 VMware ESXi,Hyper-V 以及 K ...

  2. XEN与VMware ESXi、Hyper-V 以及 KVM 架构与特点比较【非原创】

    XEN与VMware ESXi.Hyper-V 以及 KVM 架构与特点比较 2018年06月03日 12:47:15 Kim_Weir 阅读数 9402收起 分类专栏: 云计算   版权声明:本文为 ...

  3. Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. Fedora20上Xen的安装与部署

    XEN 是一种直接执行在硬件上一层软件,它能够让电脑硬件上同一时候跑多个用户的操作系统.其体系结构例如以下: XEN Hypervisor :介于操作系统和硬件之间的一个软件描写叙述层.它负责在各个虚 ...

  5. 阅读笔记---第三章 Xen信息页

    1.文件/xen/include/public/xen.h 2.第一个数据结构:启动信息页strat_info,启动信息页是GuestOS内核启动时,由Xen映射到GusetOS内存空间的一个物理页面 ...

  6. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  7. 虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构

    这一篇我要体验的虚拟机系统是 Xen.在虚拟机领域,Xen 具有非常高的知名度,其名字经常在各类文章中出现.同时 Xen 也具有非常高的难度,别说玩转,就算仅仅只是理解它,都不是那么容易.之所以如此, ...

  8. SQL Server 索引和表体系结构(聚集索引)

    聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在各个网站上面也有很多关于这方面写的不错的文章,我写这篇文章的目的也是为了将所有的知识点尽可能的组 ...

  9. Hadoop的体系结构

    HDFS和MapReduce是Hadoop的两大核心.而整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持的,并且它会通过MapReduce来实现对分布式并行任务处理的程序支持. ...

随机推荐

  1. php开发面试题---php缓存总结

    php开发面试题---php缓存总结 一.总结 一句话总结: 缓存主要分本地缓存和分布式缓存两种 可以用分布式本地缓存:把那些常用的.不容易变的页面.数据都存下来 1.常用的缓存构架? 分布式本地缓存 ...

  2. 58、salesforce学习笔记(五)

    Set集合 Set<String> set1 = new Set<String>(); set1.add('1'); set1.add('2'); Set<String& ...

  3. (转)GitHub上想下载单个文件方法

    找到该文件,单机raw,如下图: 然后会在网页打开该文件,复制URL,下载即可(如果是不可预览文件,会自动下载). 转自: GitHub上想下载单个文件方法 - Smallcaff的博客 - CSDN ...

  4. FPGA前仿真后仿真

    前仿真 后仿真 时序(综合后)仿真 时序仿真将时延考虑进去,包括综合后产生的(与.或.非)门时延,还有布局布线产生的时延. 综合(Synthesize),就是将HDL语言设计输入翻译成由与.或.非门和 ...

  5. 安装项目依赖pipreqs并生成requirements.txt

    安装项目依赖:sudo pip3 install pipreqs 生成依赖文件(requirements.txt):pipreqs ./   # 进入项目目录,在项目文件夹里生成安装依赖文件里的环境: ...

  6. SpringMVC入门及拦截器

    SSM最后一个框架springmvc,其实上手特别简单.但是我昨天看一个深入源码的视频,差点GG.其实以前学过很多东西,都忘了,不敢说学会,现在有了本书,看过一遍之后.多多少少记住一些,权当我会用了, ...

  7. rem 布局代码

    根据设计稿的高度,除以相对应的数字 <script type="text/javascript"> // 把尺寸放大N倍(N是window.devicePixelRat ...

  8. 迭代器,生成器,yield,yield from理解

    迭代器 说到迭代器就得想说可迭代对象Iterable,实现了__iter__()方法的对象都是可迭代对象,例如很多容器,list ,set, tuples.使用iter方法可以把一个可迭代对象变成迭代 ...

  9. go的目录规范

    这里举一个简单的例子:如果我们在建立一个goProject目录,通常在这个目录下我们会创建如下目录 src 存放不同的项目代码 bin 存放编译后的可执行程序 vender 存放引用的第三方库 pgk ...

  10. Javascript中的Date()对象

    创建一个指定的事件对象 需要在构造函数中传递一个表示时间的字符串作为参数例:var d2=new Date("8/27/2019"); 如果直接使用构造函数创建一个Date对象,则 ...