0%

学习Qemu-KVM虚拟机最重要的一步——调试QEMU,我们这里提前帮大家简单的总结归纳一下。
Qemu的调试稍微有点特殊的地方就是,除了Qemu程序自身源代码的调试以外,我们可以通过Qemu+GDB来调试我们虚拟机程序。下面将两个不同方面的调试方法介绍一下。

1. 调试QEMU源码

Read more »

内存虚拟化简介

前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理。可以说内存是除了CPU外最重要的组件,Guest最终使用的还是宿主机的内存,所以内存虚拟化其实就是关于如何做Guest到宿主机物理内存之间的各种地址转换,如何转换会让转换效率更高呢,KVM经历了三代的内存虚拟化技术,大大加快了内存的访问速率。

Read more »

CPU 虚拟化简介

上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要像以前想象的那样,需要用软件来模拟硬件指令集了。虚拟机的指令集直接运行在宿主机物理CPU上,当虚拟机中的指令设计到IO操作或者一些特殊指令的时候,控制权转让给了宿主机(这里其实是转让给了vm monitor,下面检查VMM),也就是一个demo进程,他在宿主机上的表现形式也就是一个用户级进程。

Read more »

虚拟机启动过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
第一步,获取到kvm句柄
kvmfd = open("/dev/kvm", O_RDWR);

第二步,创建虚拟机,获取到虚拟机句柄。
vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);

第三步,为虚拟机映射内存,还有其他的PCI,信号处理的初始化。
ioctl(vmfd, KVM_SET_USER_MEMORY_REGION, &mem);

第四步,创建vCPU
vcpufd = ioctl(vmfd, KVM_CREATE_VCPU, vcpuio)

第五步,为vCPU分配内存
vcpu_size=ioctl(kvmfd, KVM_GET_VCPU_MMAP_SIZE, NULL)
run = (struct kvm_run*)mmap(NULL, mmap_size, PROT_READ|PROT_WRITE, MAP_SHARED, vcpufd, 0)

第六步,创建vCPU个数的线程并运行虚拟机。
ioctl(vcpufd, KVM_RUN, 0);
将汇编代码加载到用户内存中,并且设置vCPU的寄存器,例如RIP

第七步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。
while(1) { ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0); };
这里的退出并不一定是虚拟机关机,虚拟机如果遇到IO操作,访问硬件设备,缺页中断等都会退出执行,退出执行可以理解为将CPU执行上下文返回到QEMU。
Read more »

KVM虚拟化简介

KVM 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。
KVM实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用Linux进程模拟虚拟机CPU和内存等。KVM不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。

Read more »

什么是QMP协议

QMP,即QEMU Machine Protocol,就是qemu虚拟机中的一种协议,是qemu的一部分。qmp是基于json格式的一整套协议,通过这套协议我们可以控制qemu虚拟机实例的整个生命周期,包括挂起、暂停、快照、查询、外设的热插拔等,以及最简单的查询,都可以通过qmp实现。 有多种方法使用qmp,这里简要介绍通过tcp和unix socket使用qmp。

Read more »

这篇内容详细记述了我在使用hexo搭载博客的过程中走过的路和跌过的坑。
另外,我搭建了一个新的博客作为自己的技术博客,地址是xuquan.site,欢迎来逛逛~

从印象笔记到简书到Hexo
我一直有收集资料的习惯,最开始把资料都放在印象笔记里,然后自己平时处理消化之后会添加一个Learning Card作为资料开头,方便自己复习和记忆。但是时间一久,资料就特别多,加上处理过和没处理过的都积攒在一起就显得特别臃肿,于是我就考虑将消化过的内容发布到简书上,给自己做一个记录,也算是自己的技术博客。

Read more »

代码版本:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git v3.16.37

在虚拟机的创建与运行中pc_init_pci负责(“KVM源代码分析2:虚拟机的创建与运行”),内存初始化也是在这里完成的,还是一步步从qemu说起,在vl.c的main函数中有ram_size参数,由qemu入参标识QEMU_OPTION_m设定,顾名思义就是虚拟机内存的大小,通过machine->init一步步传递给pc_init1函数。在这里分出了above_4g_mem_size和below_4g_mem_size,即高低端内存(也不一定是32bit机器..),然后开始初始化内存,即pc_memory_init,内存通过memory_region_init_ram下面的qemu_ram_alloc分配,使用qemu_ram_alloc_from_ptr。

Read more »

虚拟机的创建与运行章节里面笼统的介绍了KVM在qemu中的创建和运行,基本的qemu代码流程已经梳理清楚,后续主要写一些硬件虚拟化的原理和代码流程,主要写原理和qemu控制KVM运行的的ioctl接口,后续对内核代码的梳理也从这些接口下手。

QEMU:git://git.qemu.org/qemu.git v2.4.0

Read more »

原文链接:http://oenhan.com/kvm-src-2-vm-run

前段时间挖了一个坑,KVM源代码分析1:基本工作原理,准备写一下kvm的代码机制,结果一直没时间填土,现在还一下旧账,争取能温故而知新。 基本原理里面提到kvm虚拟化由用户态程序Qemu和内核态驱动kvm配合完成,qemu负责HOST用户态层面进程管理,IO处理等,KVM负责把qemu的部分指令在硬件上直接实现,从虚拟机的创建和运行上看,qemu的代码占了流程上的主要部分。下面的代码主要主要针对与qemu,KVM部分另外开篇再说。

Read more »