解剖KVM的内部是如何运作的?

云计算 虚拟化
kvm已经是内核模块,被看作是一个标准的linux 字符集设备(/dev/kvm)。Qemu通过libkvm应用程序接口,用fd通过ioctl向设备驱动来发送创建,运行虚拟机命令。

[[314764]]

一、 KVM架构

kvm基本结构有2个部分构成:

kvm 驱动,现在已经是linux kernel的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU寄存器的读写以及VCPU的运行。

另一个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。

解剖KVM的内部是如何运作的?

图1 kvm基本结构

kvm基本结构如上图。kvm已经是内核模块,被看作是一个标准的linux 字符集设备(/dev/kvm)。Qemu通过libkvm应用程序接口,用fd通过ioctl向设备驱动来发送创建,运行虚拟机命令。设备驱动kvm就会来解析命令(kvm_dev_ioctl函数在kvm_main.c文件中),如下图:

解剖KVM的内部是如何运作的?

图2 kvm_dev_ioctl函数

kvm 模块让Linux主机成为一个虚拟机监视器(VMM),并且在原有的Linux两种执行模式基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行时,三种模式的工作各为:

客户模式: 执行非I/O的客户代码,虚拟机运行在这个模式下。

用户模式:代表用户执行I/O指令,qemu运行在这个模式下。

内核模式:实现客户模式的切换,处理因为I/O或者其他指令引起的从客户模式退出(VM_EXIT)。kvm 模块工作在这个模式下。

在kvm的模型中,每一个Gust OS都是作为一个标准的linux进程,都可以使用linux进程管理命令管理。

这里假如qemu通过ioctl发出KVM_CREATE_VM 指令,创建了一个VM后,qemu需要需要发送一些命令给VM,如KVM_CREATE_VCPU。这些命令当然也是通过ioctl发送的,用户程序中用ioctl发送KVM_CREATE_VM得到的返回值就是新创建的VM对应的fd(kvm_vm),fd是创建的指向特定虚拟机实例的文件描述符,之后利用这个fd发送命令给VM进行访问控制。kvm解析这些命令的函数是kvm_vm_ioctl。 

二、 KVM 工作原理

kvm基本工作原理概述:

用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块为虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。(如下图)

解剖KVM的内部是如何运作的?

图3 KVM工作原理流程图

 

 

责任编辑:武晓燕 来源: 迈拓维矩
相关推荐

2021-02-15 15:36:04

采矿加密货币区块链

2014-11-10 09:29:13

Google

2021-12-17 22:52:44

物联网电信技术

2010-08-16 14:41:49

开源社区Ubuntu

2022-06-07 14:30:40

区块链比特币以太坊

2010-08-23 16:28:24

开源社区DebianUbuntu

2010-08-30 09:05:45

2022-05-24 17:00:41

区块链IT比特币

2017-10-30 15:26:54

数据中心超融合云计算

2021-05-28 17:24:32

人工智能AI深度学习

2017-06-23 15:45:09

AndroidThread

2022-04-26 12:45:52

TikTok机器学习人工智能

2014-09-17 11:45:20

iOS编程App运作

2023-10-07 08:41:42

JavaJVM

2012-08-13 09:39:57

虚拟化

2023-05-31 07:32:37

2022-10-26 15:22:31

React组件User组件

2022-04-28 08:00:00

TikTok人工智能架构

2022-07-27 07:32:28

Debug版本arthas

2016-05-18 14:13:02

Edge浏览器微软
点赞
收藏

51CTO技术栈公众号