Xen-名词解释
PV/HVM
PV:paravirtualization-(需要修改部分的guest-os)
HVM:hardware virtualization machine(不需要修改)
在XEN中pv是半虚拟化,hvm是全虚拟化,pv只能用于linux内核的系统,效率更高,hvm可以虚拟所有常见操作系统(可以使用windows),理论效率比pv略低,另外,hvm需要cpu虚拟化指令支持(CPU 必须开启Intel VT or AMD -V),pv无此要求。
超级调用
Making a New Hypercall && Invoking It from userland via Privcmd
0.什么是超级调用
当虚拟机的Guest OS需要执行一些更高权限的操作(如:页表的更新、对物理资源的访问等)时,由于自身在非特权域无法完成这些操作,于是便通过调用Hypercall交给Xen Hypervisor来完成这些操作。
1.超级调用&&系统调用
与系统调用类似,Xen启用130号中断向量端口作为超调用的中断号。超级调用使用0x82的中断号,参数通过寄存器传递。
2.特权级
下边的内容是在x86-32模式 下。
一般:系统内核运行在ring0;应用程序运行在ring3
泛虚拟化:xen-ring0 os-ring1 app-ring3
特权级:Ring 0/1/2/3。一般情况下,操作系统内核运行在Ring0。在Xen中,由于VMM的存在,将操作系统内核的运行权限挤到了Ring1。
所以dom0是系统内核,运行在Ring1。domU应该也是运行在Ring1中的,??这里的用户态,应该是应用程序,比如我们编写的C程序等等。
3.超级调用与特权级(Ring0/1/2/3)
超级调用不仅面向Ring1的虚拟机内核,还面向Ring3的应用程序。
Ring1
GuestOS内核无法执行某些特权操作,XEN通过超级调用(hypercall)向GuestOS提供执行的调用接口。
Ring3
When you want to make a hypercall and invoke it, you should note that Xen refuses the hypercalls which is invoked from userland. Xen provides /proc/xen/privcmd driver so that developers are able to use when they want to access to the privileged level.
通过特殊的内核驱动Primcmd ,应用程序通过系统调用ioctl进入1环Guest OS内核使用超级调用。可以认为,Ring3要想申请超级调用,先进入Ring1然后再根据Ring1的流程处理超级调用。
4.超级调用和dom(0/U)之间的关系
其实”超级调用“与“Guest-OS是dom0还是domU”没有关系,关键在于domain是PV还是HVM。之前个人以为dom0运行在Ring1,而domU运行在Ring3,现在认为不是这样,他们的系统内核同样运行在Ring1,申请超级调用的方式一样。
5.超级调用和PV/HVM的关系
超级调用实现原理此文最后的实验结果是:在PV中实验成功;在HVM中实验失败。原因在哪里?是因为没有编译内核吗?
在全虚拟化中,由于Guest OS 的代码没有被修改,因此Guest OS 的特权操作, 比如更新页表等主要通过VT 技术的VMX 操作来实现。敏感操作也不像半虚拟化那样通过超级调用来实现,也是通过VMX 的指令来实现。因此全虚拟化下的Guest OS 即HVM 很少使用超级调用。
全虚拟化下的超级调用这篇文章中又成功的实现了全虚拟化环境下的超级调用。而且教程中没有看到内核编译欸???…但是我自己实现的时候没有成功.
6.privcmd与domain
如果需要从userland申请超级调用,则需要经过指定的系统内核驱动Privcmd driver。Making a New Hypercall && Invoking It from userland via Privcmd文中有这么一句话:
If you want to use privcmd, you should compile dom0 or domU kernel with privileged configurations in the first place. (CONFIG_XEN_PRIVILEGED_GUEST=y)
是不是说明要想在userland使用privcmd,那么需要编译内核,,,,所以在内核可编译的domain中我们才可以从用户态使用privcmd??正在测试中…….
7.内核可编译与PV/HVM
内核编译了就属于PV了吗???
影子列表
0.内存虚拟化的目的
提供给虚拟机一个从0地址开始的连续物理内存空间;在虚拟机之间有效隔离,调度以及共享内存资源。
1.虚拟地址和物理地址
在真实的物理机器里,我们可以将地址层次抽象成两层,一层是虚拟地址,另一层是物理地址。不同的进程分配不同且不一定连续的物理地址空间,而客户机页表维护着虚拟地址与物理地址之间的映射关系,这使得进程看到的虚拟地址是连续的。
客户机虚拟地址
客户机物理地址
宿主机物理地址
2.直接模式&影子模式
Xen这一款虚拟机产品,是同时支持半虚拟化以及全虚拟化的,而xen也提供两种地址转换模式:直接模式和影子模式。
半虚拟化方式是允许修改客户操作系统的,于是可以通过修改客户机操作系统页表,让页表维护客户机虚拟地址到宿主机物理地址之间的映射,这就是直接模式 。
而全虚拟化时,客户机操作系统是不能修改的,那原客户机页表维护的映射就不一定能正确找到真实的宿主机物理地址,于是就采用影子模式 。
3.客户机页表&影子页表
影子页表:客户机虚拟地址&&宿主机物理地址
VFN-虚拟页框号,PFN-物理页框号,MFN-机器页框号
客户机维护并使用自己的客户机页表,填写的是VFN到PFN的映射信息。
VMM维护影子页表。影子页表是虚拟机真正使用的页表,填写着VFN到MFN的映射信息。
4.另一种解释
客户机操作系统所维护的页表负责实现客户机虚拟地址(GVA)到客户机物理地址(GPA)的转化,而这个GPA地址是不能直接发送到系统总线上去 的。还需要实现GPA到宿主机虚拟地址(HVA),宿主机虚拟地址(HVA)到宿主机物理地址(HPA)的转化,总的转换关系如下:
GVA –> GPA –> HVA –> HPA
a. GVA到GPA的转化是由客户机的页表实现的;
b. GPA到HVA的转换关系是线性一一对应的。在创建一个虚拟机的时候回设置虚拟机的内存大小,内存的大小是在qemu中设置的。比如为虚拟机分配512M 的内存,首先qemu会调用mmap()函数申请一个512M的空间,返回一个userspace_addr,这个地址是宿主机系统分配的。另外qemu 还需要设置虚拟的客户机虚拟的起始地址guest_phys_addr和大小memory_size,如0~512M。这样 HVA = userspace_addr + (GPA - guest_phys_addr);
c. HVA到HPA的转换需要宿主机的页表来实现。其实就是Qemu进程的页表,因为是Qemu调用mmap函数申请的一段虚拟地址空间,当访问这段虚拟地址空间时会发生用户空间缺页异常,从而为Qemu进程的这段虚拟地址填补具体的页面。
影子页表的出现实现了由GVA直接到HPA的地址翻译。另外,影子页表是针对于客户机中每一个进程的,也就是说客户机中的每一个进程的页表都存在一组影子页表与其相对应。
事件通道
Xen半虚拟化下,IO共享环、事件通道、授权表之间的联系和区别
事件通道的这个结构中,主要的参数是state(0-6),然后是与state对应的u.事件通道的作用就像它名字一样,用于通知guest有一个事件到达,u就是事件到达的一些参数(比如谁的哪个端口引起了这个事件).事件通道仅仅是达到了一种异步通知,域间通知的效果.其他具体的事情还需要其他机制来完成.
系统为每个Dom分配NR_EVTCHN_BUCKETS个事件通道,每个事件通道与一个结构体evtchn对应。这些结构体组成一个长度为NR_EVTCHN_BUCKETS的结构体数组,供Dom调用。
填写evtchn结构,即将evtchn的结构设置为0-6中的一种,并设置对应的联合体u中的值,u的值一般都是用来指示事件通道的绑定的dom的id和port,或者虚拟或物理中断号等.
机制并不复杂,我们只需要分配一个事件通道(需要将事件的具体描述填入这个evtchn中)
然后事件发生就会设置事件通道的pending位表示事件发生了,dom读取pending位对应的事件来选择不同的处理方式.
域间通信&域内通信
域间通信:双向连接
域内通信:Dom内部虚拟CPU之间的通信。
物理中断&虚拟中断
在很多情况下,Xen事件替代了硬件中断。中断是一种异步通信的事件,标识与机器硬件相关的一些事情发生。事件时一种异步传输的事件,标识和虚拟机相关的事件发生。一个实际的网卡在每次数据包到达的时候会发生一个信号,而虚拟接口会发送一个事件。
事件通道和超级调用
事件通道机制和超级调用机制一起完成Xen和Dom之间的控制和交互,即:使用超级调用产生从Dom到Xen的同步调用;使用异步事件机制完成从Xen到Dom的通知(Notification)递交。
其他
KVM
KVM (全称是Kernel-based Virtual Machine) 是Linux 下x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块kvm.ko 提供和虚拟化核心架构和处理器规范模块。
openVZ OS;Xen 半虚拟化;KVM 全虚拟化
VCPU
A vCPU is a virtual central processing unit that runs on VMware, the market leader in virtualization software.
VPS
虚拟专用服务器(Virtual Private Server)
openSUSE
openSUSE是一个一般用途的基于Linux内核的GNU/Linux操作系统,由openSUSE项目社区开发维护,该项目由SUSE等公司赞助。
debian
5是Debian 6是squeeze 7是wheezy 8是jessie
lsb_release -a
cat /etc/issue
一些命令
make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。
make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。
make install:将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。
make:根据Makefile编译源代码,连接,生成目标文件,可执行文件。
make world:if you want to rebuild a tree as if from a fresh check then you can use the world target. This is effectively the same as clean and the dist
make world=make clean+make dist?
apt-get update && apt-get upgrade && apt-get dist-upgrade