Created
January 22, 2014 07:35
-
-
Save chenzx/8554835 to your computer and use it in GitHub Desktop.
虚拟化技术原理与实现
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
虚拟化技术原理与实现 | |
跳转至: 导航、 搜索 | |
x86分段机制:Base+Limit+读写属性/访问权限 | |
逻辑地址 --> GDT/LDT --> (线性)虚拟地址 | |
CS DS SS ES/FS/GS | |
{L/S}{GDT/LDT}:特权指令? | |
分页机制:线性地址 --> 物理地址(TLB, CR3) | |
页表(Page Table):VFN --> PFN | |
PDE/PTE的P(present)字段:0,不在物理内存中,产生缺页中断 | |
PAE(略) | |
IA-32e | |
64位模式下,分段功能被禁用,不会执行长度检查 | |
分页:PAE必需,第4级映射:48位线性地址转换为52位物理地址(2^52=4EB?) | |
64位兼容模式 | |
新增8个通用寄存器?(R8-R15) | |
不支持虚拟8086模式 | |
x64 | |
CR8:任务优先级寄存器(TPR) | |
PIC | |
IRR:IR0-7 | |
ISR | |
IMR | |
EOI位 | |
只能用于单处理器UP,无法用于MP | |
APIC | |
LAPIC(CPU端)+IOAPIC(设备端) | |
处理器间中断(IPI):通过LAPIC中的ICR | |
IDT | |
INT n有DPL检查 | |
I/O | |
Port IO:65536个8位端口,64KB的独立地址空间 | |
MMIO:不可缓存到TLB,更先进(相当于缓冲了一下而已) | |
DMA | |
“DMAC获得总线控制权后,CPU即可挂起或只执行内部操作”嗯?DMA传输的时候CPU也做不了什么实事吧,为什么效率提高了? | |
省去了CPU指令开销?? | |
VMM | |
虽然在虚拟机状态下特权指令执行无效,但这似乎可用来检查代码是否运行在实际硬件还是虚拟机上吧? | |
“敏感指令” | |
可虚拟化:所有的敏感指令都是特权指令 | |
x86体系最初存在虚拟化漏洞:优先级压缩(Ring 0/1/3)+二进制代码转换 | |
硬件辅助的完全虚拟化 | |
Intel VT-x/AMD SVM | |
类虚拟化:客户机‘知道’自己运行在虚拟机上 | |
VMM架构 | |
Hypervisor模型:VMM相当于OS;设备驱动的工作量大(IBM S/360?) | |
Hosted:VMWare? | |
混合模型:QEMU-KVM? | |
vCPU | |
中断虚拟化 | |
内存虚拟化 | |
客户机物理地址空间? | |
2次地址转换:客户机虚拟地址(GVA)-->客户机物理地址(GPA)-->宿主机物理地址(HPA) | |
IA32 “影子页表”(虚拟TLB) | |
MMU虚拟化 | |
客户机OS修改CR3的截获处理 | |
INVLPG指令的截获处理 | |
VMM对客户机页表和影子页表不一致触发的缺页异常的截获处理* | |
缺点:实现复杂、内存开销大 | |
Intel EPT* | |
AMD NPT* | |
IO设备虚拟化 | |
MMIO:VT-x允许客户机直接访问物理IO空间 | |
DMA:VT-d提供了DMA重映射(设备的DMA操作通常无法通过软件截获) | |
PCI:设备标识符(BDF)、根条目、上下文条目 | |
IO页表:和分页机制类似* | |
AMD IOMMU | |
要点:驱动程序无需修改,地址转译+访问保护 | |
网络虚拟化 | |
Cisco VN-Tag | |
物理机内部,虚拟化网卡:“虚拟接入”+“虚拟通道”? | |
SR-IOV:将单个PCIe设备虚拟出多个独立的PCIe | |
PF | |
VF | |
时间虚拟化 | |
x86时间设备:PIT、HPET、ACPI PM、TSC | |
客户机被调度出去的情况:中断重新注入?? | |
主流虚拟化产品及其特点 | |
Xen:混合模型,OS需要显式修改才能在上面执行 | |
VMWare | |
基于Hypervisor架构的VMWare ESX Server可直接运行在裸机上? | |
VMWare vSphere:对ESX 3.5进行了稳定性、可用性、安全性等修改 | |
Hyper-V | |
KVM:宿主必须是Linux,CPU须支持虚拟化扩展 | |
Xen虚拟化技术 | |
Dom0,IDD + DomU,HVM | |
CPU半虚拟化Hypercall:支持Batch和异步2种优化方式,接近物理机速度 | |
Xen关键技术://这里可以参考《代码之美》 | |
Hypercall | |
事件通道 | |
数据共享 | |
Grant Table | |
XenStore和XenBus | |
分离设备驱动:前端+后端 | |
KVM虚拟化技术(Kernel 2.6.20+) | |
API:/dev/kvm | |
system ioctl | |
vm ioctl | |
struct kvm_run | |
vcpu ioctl | |
KVM内核模块重要的数据结构 | |
kvm_{memslots、vcpu、io_bus、vm_stat、arch、x86_ops、...} | |
qemu-kvm | |
3种运行模式:KVM(性能最好)、全模块化(应用层指令级模拟)、kqemu加速模块 | |
虚拟机管理:libvirt与virt-manager | |
Rusty Russell的virtio(设备半虚拟化,驱动需要定制修改) | |
虚拟化软件开放接口* | |
Xen Management API | |
libvirt*(略) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment