虚拟化之Libvirt、Kvm与Qemu
Kvm:kvm是硬件辅助的虚拟化技术,在x86平台上实现了全虚拟化功能,提供了一个基于内核的虚拟机。
Qemu:qemu则提供了一个开源的全虚拟化解决方案,几乎可以模拟任何硬件设备,作为用户空间工具与kvm配合使用(kvm负责cpu和内存虚拟化,qemu则负责IO虚拟化)。
Libvirt:是一种管理平台虚拟化技术的工具,提供了一系列开源的程序接口,其作为中间适配层,屏蔽了底层的hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口。
用户态与内核态
以Inter cpu为例,操作的权限分为4级:ring 0-3,0级权限最高,3级权限最低,Linux系统仅采用ring0 和 ring3这2个权限。
- ring0:内核态,具有硬件的所有操作权限,可以执行所有cpu指令集,访问任意地址的内存
- ring3:用户态,没有对硬件的直接控制权限,也不能直接访问地址的内存,通过调用系统接口访问硬件和内存
内核态涉及的主要操作包括:文件IO,网卡IO,内存分配,CPU调度。
32位系统用户进程最大可以访问3GB,内核代码可以访问所有物理内存。
64位系统用户进程最大可以访问超过512GB,内核代码可以访问所有物理内存。
由于内核可使用的内存有限,通过使用高端内存并通过逻辑地址访问所有物理内存。
切换
- 保留用户态现场(上下文、寄存器、用户栈等)
- 复制用户态参数,用户栈切到内核栈,进入内核态
- 额外的检查(内核代码对用户不信任)
- 执行内核态代码
- 复制内核态代码执行结果,回到用户态
- 恢复用户态现场(上下文、寄存器、用户栈等)
切换原因
- 系统调用:用户态进程主动切换到内核态的方式,机制的核心为系统特别开放的软中断,如Linux 的int 80h
- 异常:cpu执行过程中,发生异常后会切换到处理此异常的内核相关进程中
- 中断:外围设备在完成用户请求的操作后,会向cpu发出相应的中断信息,cpu会暂停执行下条指令并转到中断信号对应的处理程序中执行,这里的中断主要是硬中断
硬中断与软中断
硬中断
- 硬中断是由硬件产生,对CPU的中断
- 不同硬件基本都有自己的中断请求(IRQ),基于IRQ,CPU可以将请求分发到对应的硬件驱动上(内核中的一个子程序,不是一个独立的进程)
- 当中断产生的时候,CPU会中断当前正在运行的任务来处理中断,通常一个中断只能中断一个CPU
软中断
- 软中断由当前正在运行的进程所产生
- 软中断通常是一些对I/O的请求,这些请求会调用内核中可以调度I/O发生的程序,根据不同的I/O模型,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程执行
- 软中断并不会直接中断CPU,这种中断通常是需要内核帮忙做一些事情
差别
- 硬中断具有随机性和突发性;软中断是固定发生的
- 硬中断响应周期中,CPU需要发中断回合信号(NMI不需要);软中断响应周期CPU不需要发
- 硬中断的中断号是由中断控制器提供;软中断的中断号由指令给出
- 硬中断是可屏蔽的(NMI不可屏蔽);软中断不可屏蔽