Xen的体系结构
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的体系结构的更多相关文章
- 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 ...
- XEN与VMware ESXi、Hyper-V 以及 KVM 架构与特点比较【非原创】
XEN与VMware ESXi.Hyper-V 以及 KVM 架构与特点比较 2018年06月03日 12:47:15 Kim_Weir 阅读数 9402收起 分类专栏: 云计算 版权声明:本文为 ...
- Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Fedora20上Xen的安装与部署
XEN 是一种直接执行在硬件上一层软件,它能够让电脑硬件上同一时候跑多个用户的操作系统.其体系结构例如以下: XEN Hypervisor :介于操作系统和硬件之间的一个软件描写叙述层.它负责在各个虚 ...
- 阅读笔记---第三章 Xen信息页
1.文件/xen/include/public/xen.h 2.第一个数据结构:启动信息页strat_info,启动信息页是GuestOS内核启动时,由Xen映射到GusetOS内存空间的一个物理页面 ...
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- 虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构
这一篇我要体验的虚拟机系统是 Xen.在虚拟机领域,Xen 具有非常高的知名度,其名字经常在各类文章中出现.同时 Xen 也具有非常高的难度,别说玩转,就算仅仅只是理解它,都不是那么容易.之所以如此, ...
- SQL Server 索引和表体系结构(聚集索引)
聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在各个网站上面也有很多关于这方面写的不错的文章,我写这篇文章的目的也是为了将所有的知识点尽可能的组 ...
- Hadoop的体系结构
HDFS和MapReduce是Hadoop的两大核心.而整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持的,并且它会通过MapReduce来实现对分布式并行任务处理的程序支持. ...
随机推荐
- 《ArcGIS Runtime SDK for .NET开发笔记》--在线编辑
介绍 ArcGIS可以发布具有编辑功能的Feature Service.利用Feature Service我们可以实现对数据的在线编辑. 数据制作参考: https://server.arcgis.c ...
- Use Git Credential Managers to Authenticate to Azure Repos
https://docs.microsoft.com/en-us/azure/devops/repos/git/set-up-credential-managers?view=azure-devops ...
- %matplotlib inline 被注释掉后,pycharm不能生成图
目录 问题描述 解决方案 @ 问题描述 在 jupyter 编译器中 程序的开头,有这么一行 %matplotlib inline import numpy as np import matplotl ...
- Python变量的下划线
xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部 ...
- Django框架(三十)—— 使用Vue搭建前台
目录 vue的使用 一.创建vue项目 二.pycharm开发vue项目 1.安装vue.js插件 2.运行vue项目 三.vue项目的目录结构 四.vue的使用 1.创建新的组件 2.显示数据 3. ...
- cmd 运行 java 文件
在安装好jdk 并配置好环境变量的情况下 原因一:没有指定class文件的路径 例如HI是变异好的class文件,并且在d:/RJAZB里面 如果写成 Java HI 则会报错 正确做法 java ...
- python配置文件configparser详解
Python中一般需要配置文件,配置文件一般以.cfg, .conf, .ini结尾.配置文件可以将数据库抽离到以 .ini(Windows)结尾的文件中,这样做的优点在于可在配置文件中添加多个数据库 ...
- Python升级3.多
本文主要介绍在Linux(CentOS)下将Python的版本升级为3.6.2的方法 众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的 ...
- MATLAB中的fspecial函数
Matlab 的fspecial函数用法 转载:https://blog.csdn.net/majinlei121/article/details/50255837 fspecial函数用于建立预定义 ...
- 自定义input[type="radio"]
对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 对单选按钮自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :c ...