KVM内核文档阅读笔记
KVM在内核中有丰富的文档,位置在Documentation/virtual/kvm/。
00-INDEX:整个目录的索引及介绍文档。
api.txt:KVM用户空间API,所谓的API主要是通过ioctl来实现的。
cpuid.txt:KVM的cpuid相关API。
devices/:各种平台相关设备API。
hypercalls.txt:KVM的hypercall介绍,介绍了X86和S390的支持的hypercall详细信息。
locking.txt:介绍了KVM用到的锁、互斥量。
mmu.txt:介绍了Guest X86 MMU功能。
msr.txt:X86架构下的MSR用途。
nested-vmx.txt:使用X86特有的VMX来更简洁高效的运行Guest OS。
ppc-pv.txt和说90-diag.txt:针对PPC和S390架构的特殊用途,忽略。
review-checklist.txt:KVM相关patch的review检查列表。
timekeeping.txt:X86架构下时间虚拟化设备。
关于KVM API定义的文档(api.txt)
1.概述
KVM API是一系列用来控制VM各方面的ioctl。它包括三个方面:
System ioctls:这些ioctl用来查询或者设置影响整个KVM子系统的属性。并且有一个system ioctl用来创建VM。
VM ioctls:这些ioctl用来查询或者设置影响整个VM的属性,其中一个VM ioctl用来创建vcpu。这些VM ioctl只能在用来创建此VM的进程中使用。
vcpu ioctls:这些ioctl用来查询或者设置能够控制单个vcpu的属性。这些vcpu ioctl只能在创建此vcpu的线程中使用。
从上面描述,可以清晰看出三者的层级关系:System ioctls(整个KVM子系统) > VM ioctls(单个VM实体) > vcpu ioctls(单个vcpu)。
2.文件描述符
KVM API是围绕文件描述符展开的。从打开/dev/kvm开始,获得操作整个KVM子系统的句柄,这个句柄用来执行System ioctls。基于此System句柄执行KVM_CREATE_VM可以创建一个VM的文件句柄,VM句柄用来执行VM ioctls。基于VM句柄的KVM_CREATE_VCPU用来创建一个vcpu句柄。vcpu句柄执行系列vcpu ioctls用来控制vcpu。
常见的文件句柄的特性在KVM并不适用,比如fork操作等。KVM里面只支持一个VM一个进程,一个vcpu一个线程。
3.API描述
每个API,即ioctl都包含一些信息,比如能力、所属架构、类型(System、VM、vcpu)、参数和返回值。这些ioctl非常多,并且庞杂,根据类型分为3类。有一些特殊架构专有的ioctl活在Architecture中列出,如果通用则是all。
下面重点分析Architecture为all或者x86,Capability为basic类型的ioctl。
System ioctls
| API值 | 说明 |
| KVM_GET_API_VERSION | 目前情况下返回值,只有12。如果返回12,表示所有能力为basic的ioctl都能否使用。其他值是不被允许的。 |
| KVM_CREATE_VM | 创建一个VM,返回的句柄可以用来控制创建的VM。但此时VM还没有vcpu和memory。 |
| KVM_GET_MSR_INDEX_LIST | 返回Guest支持的MSRs |
| KVM_CHECK_EXTENSION | |
| KVM_GET_VCPU_MMAP_SIZE | 返回运行vcpu的KVM_RUN使用的共享Memory Region大小。 |
VM ioctls
| API值 | 说明 |
| KVM_CAP_CHECK_EXTENSION_VM | |
| KVM_CREATE_VCPU | 在VM里添加一个vcpu,但是总数不会超过max_cpus。vcpu的id在[0, max_vcpu_id)之间。 |
| KVM_GET_DIRTY_LOG | |
| KVM_SET_MEMORY_ALIAS | |
| KVM_CREATE_IRQCHIP | |
| KVM_GET_IRQCHIP | |
| KVM_SET_IRQCHIP | |
| KVM_GET_CLOCK | |
| KVM_SET_CLOCK | |
| KVM_GET_VCPU_EVENTS | |
| KVM_SET_VCPU_EVENTS | |
| KVM_SET_USER_MEMORY_REGION | |
| KVM_CAP_ENABLE_CAP_VM | 不是所有的能力都被默认打开,可以使用此ioctl来扩展。 |
vcpu ioctls
| API值 | 说明 |
| KVM_RUN | 用于运行一个Guest的vcpu。 |
| KVM_GET_REGS | 返回vcpu的通用寄存器值,通过struct kvm_regs结构体返回,根据不同架构有所不同。 |
| KVM_SET_REGS | 设置vcpu的通用寄存器。 |
| KVM_GET_SREGS | 读取不同架构vcpu的特殊寄存器。 |
| KVM_SET_SREGS | 设置不同架构vcpu的特殊寄存器。 |
| KVM_TRANSLATE | |
| KVM_INTERRUPT | |
| KVM_DEBUG_GUEST | |
| KVM_GET_MSRS | |
| KVM_SET_MSRS | |
| KVM_SET_CPUID | |
| KVM_SET_SIGNAL_MASK | |
| KVM_GET_FPU | 获取vcpu的FPU状态。 |
| KVM_SET_FPU | 设置vcpu的FPU状态。 |
| KVM_ENABLE_CAP | 不是所有的能力都被默认打开,可以使用此ioctl来扩展。 |
下面一段代码很好的诠释了KVM->VM->vcpu之间的关系:

|
int ret, kvmfd = -1, vmfd = -1, cpufd = -1; kvmfd = qemu_open("/dev/kvm", O_RDWR); |
4.kvm_run结构体
KVM Hypercall(hypercalls.txt)
这里重点关注x86架构下的Hypercall。
KVM hypercall最多支持四个参数,通过rbx、rcx、rdx、rsi。Hypercall调用号通过rax传递,返回时rax存放返回值。
一般情况下,其他寄存器不参与Hypercall。
适用于X86架构的Hypercall有三个:KVM_HC_VAPIC_POLL_IRQ、KVM_HC_MMU_OP、KVM_HC_KICK_CPU。
Hypercall的定义在include/uapi/linux/kvm_para.h中:
|
#define KVM_HC_VAPIC_POLL_IRQ 1 |
KVM_HC_VAPIC_POLL_IRQ:Host检查关起的中断。
KVM_HC_MMU_OP:支持MMU操作,比如PTE、flushing TLB、release PT。
KVM_HC_KICK_CPU:唤醒HLT状态下的vcpu。如果Guest内核模式下一个vcpu等待时间超时而执行HLT指令,另一个同Guest下vcpu可以通过触发KVM_HC_KICK_CPU来唤醒。
这些Hypercall都在kvm_emulate_hypercall中处理:
|
int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) kvm_x86_ops->skip_emulated_instruction(vcpu); if (kvm_hv_hypercall_enabled(vcpu->kvm)) nr = kvm_register_read(vcpu, VCPU_REGS_RAX); Hypercall调用号 … switch (nr) { |
支持Guest的MMU功能(mmu.txt)
X86 KVM的shadow MMU功能提供一个标准的MMU功能给Guest,将Guest的物理地址转换成Host物理地址。
关于Nested VMX是一种嵌套式虚拟功能,能够使一台虚拟机具有物理机CPU特性,支持VMX/SVM硬件虚拟化。参考《Nested VMX》。这样虚拟机可以使自己成为一个Hypervisors,并在其上安装虚拟机。
所谓Nested就是运行在Guest上的嵌套Guest,Guest作为Hypervisor。
|
术语 |
解释 |
|
PFN |
Host page frame number |
|
HPA |
Host physical address |
|
HVA |
Host virtual address |
|
GFN |
Guest page frame number |
|
GPA |
Guest physical address |
|
GVA |
Guest virtual address |
|
NGPA |
Nested guest physical address |
|
NGVA |
Nested guest virtual address |
|
PTE |
Page table entry |
|
GPTE |
Guest page table entry |
|
SPTE |
Shadow page table entry |
|
TDP |
Two dimensional paging |
此处KVM MMU功能主要工作就是配置处理器的MMU以达到将Guest地址转变到Host。有下面三种不同的转变需求:
-当Guest关闭分页功能时,将Guest物理地址转变成Host物理地址。GPA->HPA
-当Guesst使能分页功能时,将Guest虚拟地址,转变成Guest物理地址,进而Host物理地址。GVA->GPA->HPA
-当Guest又虚拟化一个嵌套Guest时,将嵌套的Guest虚拟地址转变成嵌套的物理地址,进而Guest物理地址,最后是Host物理地址。NGVA->NGPA->GPA-HPA
GPA是运行KVM进程的用户地址空间的一部分。用户空间定义了Guest地址到用户空间地址的转变(GPA->HVA)。两个不同的GPA可以映射到一个HVA,但反之不成立。
KVM内核文档阅读笔记的更多相关文章
- Keras 文档阅读笔记(不定期更新)
目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...
- Resin文档阅读笔记
阅读文档对应的版本为Resin4.0,且基本只关注Standard版本的功能. 1.Resin可以注册为服务: To install the service, use C:/> resin-3. ...
- rocksdb wiki文档阅读笔记
由于是英文文档,不做笔记过一阵就忘了,现在把关键点记录到这,开发的时候使用. 具体wiki地址:https://github.com/facebook/rocksdb/wiki 1)Column Fa ...
- webDriver文档阅读笔记
一些雷 浏览器版本和对应的Driver的版本是一一对应的,有时候跑不起来,主要是因为driver和浏览器版本对不上. e.g: chrome和driver版本映射表:https://blog.csdn ...
- elasticsearch 文档阅读笔记(三)
文档 elasticsearch是通过document的形式存储数据的,个人理解文档就是一条数据一个对象 我们添加索引文档中不仅包含了数据还包含了元数据 比如我们为一个数据添加索引 文档中不仅有jso ...
- mongodb官网文档阅读笔记:与写性能相关的几个因素
Indexes 和全部db一样,索引肯定都会引起写性能的下降,mongodb也没啥特别的,相对索引对读性能的提示,这些消耗通常是能够接受的,所以该加入的索引还是要加入.当然须要慎重一些.扯点远的,以前 ...
- Mybatis文档阅读笔记(明日继续更新...)
今天在编写mybatis的mapper.xml时,发现对sql的配置还不是很熟,有很多一坨一坨的东西,其实是可以抽取成服用的.不过良好的组织代码,还是更重要的.
- Qt文档阅读笔记-QGraphicsItem::paint中QStyleOptionGraphicsItem *option的进一步认识
官方解析 painter : 此参数用于绘图;option : 提供了item的风格,比如item的状态,曝光度以及详细的信息:widget : 想画到哪个widget上,如果要画在缓存区上,这个参数 ...
- vue文档阅读笔记——计算属性和侦听器
页面链接:https://cn.vuejs.org/v2/guide/computed.html 注意点 计算属性用于 替代模板内的表达式. 如果计算属性所依赖的属性未更新,会返回自身的缓存. 侦听器 ...
随机推荐
- 基于ARM_contexA9 led驱动编程
关于友善之臂出的这款contexA9开发板,目前在网络上的资源较少,特别是内核的,非常之少,鉴于这种情况,我将会写一个系列的驱动来做关于tiny4412这款板子开发的总结. 简单介绍一下: Tiny4 ...
- LeetCode之“树”:Symmetric Tree && Same Tree
Symmetric Tree 题目链接 题目要求: Given a binary tree, check whether it is a mirror of itself (ie, symmetric ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Linux完整备份工具 - dump, restore(现在基本不用这两个)
dump 其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级喔!什么意思啊! 假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump ...
- OpenCV——彩色图像转成灰度图像
// PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include <iostr ...
- SharePoint 2010 之寻找页面布局
习惯了2007的页面布局,虽然感觉不是太好用,尤其以开始接触时非常不理解页面布局和页面的关系,但是后来理清了,感觉还是很好用的,尤其对于相同格式的网站,修改布局而不改页面的情况,还是非常有效的,好了, ...
- Struct和Union在内存大小上的区别
名字起的不好,但是也不知道该叫什么好,题目如下: typedef union {];char c;} DATE; struct data { int i; DATE k; double j; }; i ...
- 恶补web之四:xhtml学习
xhtml是更严格更纯净的html代码,它与html4.01兼容.xhtml是以xml重构额html4.01 xhtml与2000年1月26日成为w3c标准,w3c将xhtml定义为最新的html版本 ...
- linux下让irb实现代码自动补全的功能
我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:requir ...
- MongoDB学习笔记(四)
第四章 Mongodb聚合函数 插入 测试数据 for(var j=1;j<3;j++){ for(var i=1;i<3;i++){ var person={ Name:"ja ...