最近想换工作,接下来几年想做虚拟化,于最决定研究一下KVM的内核源码,当作学习笔记吧,作个备份。
此次研究基于Linux内核版本2.6.35.13进行源码分析。
1. kvm 内核英文文档翻译。kvm内核文档比较少,就三个 api.txt cpuid.txt mmu.txt,依次进行。
gavin@~ linux-2.6.35.13$ ls ./Documentation/kvm/
api.txt cpuid.txt mmu.txt
api.txt翻译笔记:
描述:
KVM模块在linux中的表现形式为/dev/kvm设备结点。
KVM API是一组ioctl的的集合,这些api用于控制vm, ioctl集合主要分为三类: (System ioctls, VM ioctls, VCPU ioctls).
A System ioctls: 用于查询/设置整个kvm子系统的全局属性。此外也也可以用于创建VM.
B VM ioctls: 用于查询/设置影响虚拟机的属性。例如: 内存布局。此外也可以用于创建虚拟的CPU(VCPU).
只有相同的进程(地址空间)VM ioctls才能创建虚拟机。
C VCPU ioctls:用于查询/设置那个用于控制单个虚拟CPU操作的属性。
只有相同的线程的VCPU ioctls才能创建虚拟CPU
文件描述符
KVM API 围绕文件描述符。open("/dev/kvm")获取kvm句柄,这个句柄可以用于进行System ioctls操作。通过该句柄发生一个KVM_CREATE_VM ioctls可以创建一个vm文件描述符,通过该描述符可以使用VM ioctls。通过这个vm文件描述发起一起KVM_CREATE_VCPU ioctls可以创建一个虚拟的CPU,并返回一个文件描述符,通过这个文件描述符可以控制虚拟CPU,也包括运行客户机代码这样的重要任务。
一般来说,文件描述符可以在进程中通过fork和Unix域套接字的SCM_RIGHTS进行迁移,但是KVM明确表示不支持这些招数,他们不会危害到主机,但实际行为不能保证,因为KVM仅支持一个虚拟机一个进程,一个虚拟cpu一个线程。
扩展
感觉没啥用,跳过了。
API 描述