Skip to content

Instantly share code, notes, and snippets.

@chenzx
Created January 22, 2014 07:35
Show Gist options
  • Save chenzx/8554835 to your computer and use it in GitHub Desktop.
Save chenzx/8554835 to your computer and use it in GitHub Desktop.
虚拟化技术原理与实现
虚拟化技术原理与实现
跳转至: 导航、 搜索
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