![](https://csdnimg.cn/release/download_crawler_static/86810906/bg4.jpg)
(word 完整版)Linux KVM 虚拟化源代码分析文档
图 3 I/O 分析
(1)当数据包到达主机的物理网卡后,调用物理网卡的驱动程序,在其中利用 Linux 内核中的软件网桥,实
现数据的转发。
(2)在软件网挢这一层,会判断数据包是发往那个设备的,同时调用网桥的发送函数,向对应的端口发送数
据包。
(3)若数据包是发往虚拟机的,则要通过 tap 设备进行转发,tap 设备由两部分组成,网络设备和字符设备。
网络设备负责接收和发送数据包,字符设备负责将数据包往内核空间和用户空间进行转发。Tap 网络部分收
到数据包后,将其设备文件符置位,同时向正在运行 VM 的进程发出 I/O 可用信号,引起 VM Exit,停止 VM 运
行,进入根操作状态。KVM 根据 KVM_EXIT_REASON 判断原因,模拟 I/O 指令的执行,将中断注入到 VM 的中断
向量表中。
(4)返回用户模式的 Qemu 中,执行设备模型。返回到 kvm_main loop 中,执行 Kvm—main-loop—wait,之后
进入 main_loop wait 中,在这个函数里收集对应设备的设备文件描述符的状态,此时 tap 设备文件描述符
的状态同样被集到 fd set。
(5)Kvm main—loop 不停地循环,通过 select 系统调用判断哪螋文件描述符的状态发生变化,相应的调用
对应的处理函数。对予 tap 来说,就会通过 Qemu-send_packet 将数据发往 rtl8139 一 do—receiver,在这个
函数中完成相当于硬件 RTL8139 网卡的逻辑操作。KVM 通过模拟 I/O 指令操作虚拟 RTL8139 将数据拷贝到用
户地址空间,放在相应的 I/O 地址。用户模式处理完毕后返回内核模式,而后进入客户模式,VM 被再次执行,
继续收发数据包。
3,KVM 源代码分析—虚拟机创建和运行流程代码分析
3.1 KVM 创建和运行虚拟机流程
KVM 虚拟机创建和运行虚拟机分为用户态和核心态两个部分,用户态主要提供应用程序接口,为虚拟机创
建虚拟机上下文环境,在 libkvm 中提供访问内核字符设备/dev/kvm 的接口;内核态为添加到内核中的字符设
备/dev/kvm,模块加载进内核后即可进行接口用户空间调用创建虚拟机。在创建虚拟机过程中,kvm 字符设备
主要为客户机创建 kvm 数据机构,创建该虚拟机的虚拟机文件描述符及其相应的数据结构以及创建虚拟处理
器及其相应的数据结构。Kvm 创建虚拟机的流程如图 4 所示。
首先申明一个 kvm_context_t 变量用以描述用户态虚拟机上下文信息,然后调用 kvm_init()函数初始
化虚拟机上下文信息;函数 kvm_create()创建虚拟机实例,该函数通过 ioctl 系统调用创建虚拟机相关的
内核数据结构并且返回虚拟机文件描述符给用户态 kvm_context_t 数据结构;创建完内核虚拟机数据结构后,
再创建内核 pit 以及 mmio 等基本外设模拟设备,然后调用 kvm_create_vcpu()函数来创建虚拟处理器,
kvm_create_vcpu()函数通过 ioctl()系统调用向由 vm_fd 文件描述符指向的虚拟文件调用创建虚拟处理