Xen Introduction

 

     guest OS是指Xen能够操控的操作系统之一,domain是指一个运行中的虚拟机,在其上有一个guest OS在执行。我们称Xen本身为hypervisor,因为它运行的特权级要比它所操控的guest OS中的supervisor code运行的特权级更高。

 

     虚拟化CPUguest OS提出了几个要求。因为hypervisor插在操作系统的下层违背了惯常的关于操作系统在整个系统中特权最高的假设。为了保护hypervisor不会受到操作系统不正确行为的影响(即domain不受另一个domain的影响),guest OS就必须被改造为能够运行在较低的特权级上。很多处理器体系结构只是提供了两个特权级。在这些情况下,guest OS和应用程序共享较低的特权级。同时,guest OS运行在单独的地址空间中以保护自己不会受到应用程序执行的影响。guest OS通过hypervisor设定虚拟的特权级和改变当前的地址空间来间接地和应用之间进行控制传递。另外,如果处理器的TLB支持地址空间标记,那么也就可以避免TLB刷新带来的高昂代价。

 

     因为x86架构在硬件上支持四个不同的特权级。x86架构的特权级通常用圈(ring)来表示,从ring 0(最高特权)到ring 3(最低特权)。操作系统的代码运行在ring 0这个特权级上,因为再没有其它的ring能够执行那些特权指令。ring 3通常用于执行应用代码。就我们所知,自OS/2起到现在的各个知名的x86 架构上的操作系统都还没有利用ring 1ring 2这两个特权级的。那么,任何遵循这个通常的安排的操作系统(没有使用ring 1ring 2)就都可以移植到Xen上来。

这个移植过程只需要做一些改动使操作系统改为运行在ring 1特权级上。这就防止了guest OS会直接执行特权指令,也保证了操作系统与运行在ring 3上的应用程序之间相隔离的安全性。特权指令需要被Xen确认和执行以达到准虚拟化的目的,这主要应用于诸如安置新的页表,或者在处理器idle时放弃之(而不是去halt它)等操作。因为只有Xen有足够高的特权级来执行这些指令,所以任何guest OS试图直接运行特权指令都会失败,后果要么是沉默要么是产生错误。异常,包括内存错误和软件陷阱,都可以在x86架构的基础上直接进行虚拟化。有一个表,内容为对每类异常进行描述的句柄。表中所列的异常都是在Xen中有记录的,以用作确认。表中给出的句柄都是与真正的x86硬件中相同的;之所以这一点是可能做到的,主要是因为在我们的准虚拟化架构中,异常堆栈框架是没有被修改的。唯一的一个改动是在页面错误句柄上。因为该句柄的操作需要从特权处理器寄存器(CR2)中读出出错的地址;但是这是不可能的(因为特权级别不够了),我们就将它(页面错误句柄?CR2的值?)写入扩展的堆栈框架中(后来发现,在移植XP的时候,将这个值写入一个预先商定的共享存储位置上要比修改堆栈框架简单一些)。当系统在ring 0以外执行时有异常发生,Xen的句柄就会在guest OS堆栈中创建一个异常堆栈框架的拷贝,并且会将控制交给相应的已经记录过的异常句柄。

    

    典型的,只有两类异常会经常发生而影响到系统的性能:系统调用(一般都是通过软件异常实现)和页面错误。我们让每个guest OS都记录一个快速的异常操作句柄来改进系统调用的性能。这个异常操作句柄可以直接由处理器使用,而不必非要间接地经过ring 0;这个句柄在放置进硬件异常列表中之前就是经过确认的(所以不必经过Xen)。不幸的是,我们不可能使用同样的技术来处理页面错误句柄,因为只有那些运行在ring 0的代码才能够从寄存器CR2中读出错误的地址;因此,页面错误必须要经过Xen才能提交,Xen保存该寄存器的值供来自ring 1的访问使用。

     

     Xen发现异常产生时,它会对异常句柄进行确认以确保安全性。这只需要检查句柄的代码段中是否含有指明要在ring 0中执行的操作。既然没有guest OS能够创建这样一个段,那么只需要将专门的段选择符和少量的保留在Xen中的静态值作比较即可。除了这点以外,任何其它的句柄问题都会在异常传播(exception propagation)(一个异常导致了另一个异常的产生)的过程中被修正。例如,如果句柄缺少相应代码段或者句柄没有分配到内存页,那么在Xen为将控制返回给句柄而执行iret指令的时候就会有一个相应的错误产生。Xen通过检查出错的程序计数器值来检测这些双错误(double faults:之前已经出错了,现在到了iret已经是第二个错误了;第二个错误是由第一个错误传播而来):如果地址是处于异常虚拟化的代码中(说明异常处理没有完成,iret没成功),那么guest OS就要被终止。

对于直接的系统调用句柄来说,这种懒惰(第一个错误发生的时候,没有被检查到;直到Xen执行了iret之后才报错)的检查也是安全的:当CPU试图直接跳至guest OS句柄的时候,会发生访问错误(之前的过程都一样,只是直接的系统调用是不经过Xen的)。在这种情况下,产生错误的地址将处于Xen之外(因为Xen不会去执行guest OS系统调用),因此错误就以上文讲过的一般方式进行虚拟化即可。如果由于错误的传播导致了进一步的双错误,那么guest OS会像上文谈及的一样被终止。

整个系统架构中有一个domain是在引导(boot)时创建的。这个domain被允许使用控制接口。这个初始的domain,术语称为Domain 0,它负责操控应用级的管理软件。控制接口具有创建和终止其它domain的能力,还能控制它们相关的调度参数、物理存储分配以及它们对给定的物理磁盘和网络设备的访问。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值