KVM初始化过程

2023-11-13

  之前打算整理一下在Guest VM, KVM, QEMU中IO处理的整个流程,通过查阅资料和阅读源码,已经大致知道IO在Guest KVM中的处理流程.当想要整理IO在KVM和QEMU中的处理时,发现很难理清楚QEMU和KVM之间的跳转和交互的过程,于是促使自己去了解QEMU和KVM启动的过程.(本文展示的代码中,qemu版本为1.6.0, linux内核版本为3.7.10)

    为了介绍qemu和kvm的交互过程,我首先介绍一下kvm给用户提供的接口.kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换.当要创建一个新的虚拟机时,首先打开/dev/kvm设备,在其上调用ioctl函数:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. system_fd = open("/dev/kvm", ORDWR);  
  2. vm_fd = ioctl(system_fd, KVM_CREATE_VM, 0);  
ioctl函数在kvm中的实现为virt/kvm/kvm_main.c中kvm_dev_ioctl函数,当传入的参数为KVM_CREATE_VM时,该函数会创建一个VM,并且返回一个fd,通过该fd可以操作虚拟机.

    创建完虚拟机之后,需要在该虚拟机上面创建vcpu,调用的接口也是ioctl,只是此时对应的fd为创建虚拟机时返回的fd.

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. vcpu_fd = ioctl(vm_fd, VM_CREATE_VCPU, 0)  
此时ioctl函数对应的实现为virt/kvm/kvm_main.c中kvm_vm_ioctl函数,当传入的参数为VM_CREATE_VCPU时,与KVM_CREATE_VM过程类似,它创建一个vcpu并且返回可以操作该vcpu的fd.

    创建完vcpu后,可以在该vcpu上面调用ioctl函数进入guest vm.

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. ret = ioctl(vcpu_fd, KVM_RUN, 0);  
此时ioctl函数对应的实现为virt/kvm/kvm_main.c中kvm_vcpu_ioctl函数,若传入的参数为KVM_RUN,它最终会调用vcpu_enter_guest函数进入guest vm.


    qemu作为一个user mode的程序,其入口为main函数,该main函数定义在vl.c文件中.main函数比较长,其中跟KVM初始化相关的主要有两个函数:configure_accelerator()和machine->init(&args). cofigure_accelerator()函数选择运用哪一种虚拟化方案,其应用到的数据结构为accel_list,会调用accel_list[i].init函数.accel_list的初始化如下所示,当使用kvm虚拟化解决方案时,accel_list[i].init对应的函数即为kvm_init.

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. static struct {  
  2.     const char *opt_name;  
  3.     const char *name;  
  4.     int (*available)(void);  
  5.     int (*init)(void);  
  6.     bool *allowed;  
  7. } accel_list[] = {  
  8.     { "tcg""tcg", tcg_available, tcg_init, &tcg_allowed },  
  9.     { "xen""Xen", xen_available, xen_init, &xen_allowed },  
  10.     { "kvm""KVM", kvm_available, kvm_init, &kvm_allowed },  
  11.     { "qtest""QTest", qtest_available, qtest_init, &qtest_allowed },  
  12. };  
kvm_init函数定义在kvm-all.c文件中,其主要功能是打开/dev/kvm设备,创建一个虚拟机.

    machine->init(&arg)函数主要初始化硬件设备,并且调用qemu_init_vcpu为每一个vcpu创建一个线程,线程执行的函数为qemu_kvm_cpu_thread_fn.从qemu main到qemu_init_vcpu之间函数调用关系涉及到一些函数指针的赋值源码比较难于读懂,以下是使用gdb调试打出其调用关系.

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. #0 qemu_init_vcpu (cpu=0x55555681ea90) at /home/dashu/kvm/qemu/qemu-dev-zwu/cpus.c:1084  
  2. #1 0x0000555555909f1e in x86_cpu_realizefn (dev=0x55555681ea90, errp=0x7fffffffd8f8) at /home/dashu/kvm/qemu/qemu-dev-zwu/target-i386/cpu.c:2399  
  3. #2 0x00005555556c768a in device_set_realized (obj=0x55555681ea90, value=true, err=0x7fffffffda88) at hw/core/qdev.c:699  
  4. #3 0x000055555580b93f in property_set_bool (obj=0x55555681ea90, v=0x5555565bab20, opaque=0x5555565375a0, name=0x555555a01f88 "realized", errp=0x7fffffffda88) at qom/object.c:1300  
  5. #4 0x000055555580a484 in object_property_set (obj=0x55555681ea90, v=0x5555565bab20, name=0x555555a01f88 "realized", errp=0x7fffffffda88) at qom/object.c:788  
  6. #5 0x000055555580bbea in object_property_set_qobject (obj=0x55555681ea90, value=0x555556403e40, name=0x555555a01f88 "realized", errp=0x7fffffffda88) at qom/qom-qobject.c:24  
  7. #6 0x000055555580a770 in object_property_set_bool (obj=0x55555681ea90, value=true, name=0x555555a01f88 "realized", errp=0x7fffffffda88) at qom/object.c:851  
  8. #7 0x00005555558a7de0 in pc_new_cpu (cpu_model=0x555555a0200b "qemu64", apic_id=0, icc_bridge=0x55555655b2c0, errp=0x7fffffffdac8) at /home/dashu/kvm/qemu/qemu-dev-zwu/hw/i386/pc.c:922  
  9. #8 0x00005555558a7fed in pc_cpus_init (cpu_model=0x555555a0200b "qemu64", icc_bridge=0x55555655b2c0) at /home/dashu/kvm/qemu/qemu-dev-zwu/hw/i386/pc.c:978  
  10. #9 0x00005555558a923b in pc_init1 (system_memory=0x5555562a7240, system_io=0x5555562a7f60, ram_size=1073741824, boot_device=0x555555a0248a "cad", kernel_filename=0x0, kernel_cmdline=0x5555559f85be "",   
  11. initrd_filename=0x0, cpu_model=0x0, pci_enabled=1, kvmclock_enabled=1) at /home/dashu/kvm/qemu/qemu-dev-zwu/hw/i386/pc_piix.c:105  
  12. #10 0x00005555558a9a36 in pc_init_pci (args=0x7fffffffdf10) at /home/dashu/kvm/qemu/qemu-dev-zwu/hw/i386/pc_piix.c:245  
  13. #11 0x00005555558a9a7f in pc_init_pci_1_6 (args=0x7fffffffdf10) at /home/dashu/kvm/qemu/qemu-dev-zwu/hw/i386/pc_piix.c:255  
  14. #12 0x00005555558584fe in main (argc=10, argv=0x7fffffffe148, envp=0x7fffffffe1a0) at vl.c:4317  

    qemu_kvm_cpu_thread_fn函数创建vcpu,然后调用kvm_cpu_exec函数.kvm_cpu_exec函数调用ioctl进入kvm并最终进入guest vm.

    以上即为qemu调用kvm的接口初始化kvm的过程.后续我会整理出IO在kvm和qemu之间执行过程,同时描述kvm和qemu之间如何协同工作的.


参考资料:

1. qemu-kvm的初始化与客户系统的执行:http://blog.csdn.net/lux_veritas/article/details/9383643

2. 内核虚拟化kvm/qemu----guest os,kvm,qemu工作流程:http://www.360doc.com/content/12/0619/13/7982302_219186951.shtml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KVM初始化过程 的相关文章

  • KVM虚拟机配置静态IP(三):Centos6

    该系列文章为制作KVM虚拟机镜像的同时配置静态IP xff0c 为用户直接提供好固定IP xff0c 无需手动配置 系列文章目录 Ubuntu16 04Ubuntu18 04Centos6Centos7 文章目录 系列文章目录软件环境一 安
  • Ubuntu20 + KVM虚拟机

    1 命令汇总 span class token comment 查看一下linux是32位还是64位 xff1a span span class token function file span bin ls span class toke
  • kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr

    前文 KVM 虚拟化环境搭建 ProxmoxVE 已经给大家介绍了开箱即用的 PVE 系统 xff0c PVE 是方便 xff0c 但还是有几点问题 xff1a 第一 xff1a 始终是商用软件 xff0c 虽然可以免费用 xff0c 但未
  • kvm虚拟机利用virsh查看ip

    1 virsh dumpxml win7 grep mac 查看win7虚拟机mac 2 arp a 显示mac与ip对应关系 示例 xff1a root 64 localhost virsh dumpxml ubuntu yusen gr
  • 虚拟化(KVM)

    虚拟化介绍 VMware Workstation就是虚拟化 虚拟化简单讲 xff0c 就是把一台物理计算机虚拟成多台逻辑计算机 xff0c 每个逻辑计算机里面可以运行不同的操作系统 xff0c 相互不受影响 xff0c 这样就可以充分利用硬
  • 服务器配置虚拟kvm功能,服务器 配置虚拟kvm功能

    服务器 配置虚拟kvm功能 内容精选 换一换 使用外部镜像文件创建私有镜像时 xff0c 以上相关步骤操作需要在虚拟机内部完成 xff0c 强烈建议您在原平台的虚拟机实施修改后 xff0c 再导出镜像 使用Windows外部镜像文件创建私有
  • 如何在 Ubuntu 20.04 上安装 Kvm

    KVM 基于内核的虚拟机 是内置于 Linux 内核中的开源虚拟化技术 使用 KVM 运行多个 Linux 或 Windows 来宾虚拟机 每个来宾都与其他来宾完全隔离 并拥有自己的操作系统和专用虚拟硬件 例如 CPU 内存 网络接口和存储
  • kvm故障-虚拟机通过镜像创建虚后无法加载eth0网卡,显示网卡为ens3

    虚拟机通过镜像创建虚后无法加载eth0网卡 显示网卡为ens3 一 首先创建eth0网卡文件配置好 cd etc sysconfig network scripts TYPE Ethernet PROXY METHOD none BROWS
  • CentOS 7 virt-install 命令行方式(非图形界面)安装KVM虚拟机

    环境及网卡配置请参考 https blog csdn net mshxuyi article details 98305715 创建镜像目录 mkdir p home vms virt install 配置文件 virt install n
  • Proxmox VE(PVE) 进行网卡直通

    文章目录 我的设备 介绍 添加CPU支持 开启iommu 查询网卡信息 Intel CPU AMD CPU 新增所需模块 添加PCI设备 命令模式添加 web页面模式添加 验证IOMMU有效 IOMMU中断重映射 查看中断重映射 启用中断重
  • 虚拟化原理之KVM

    2 1 kvm技术基础 KVM kernel based virtual machine 的名字 基于kernel的虚拟机 已经很准确的说出了kvm的设计思路 也就是依赖linux内核 完全利用linux内核来实现cpu的调度 内存管理的功
  • KVM同步脏页原理

    文章目录 硬件基础 SPTE 硬件要素 工作流程 PML 硬件要素 工作流程 数据结构 用户态 内核态 API 脏页开启 脏页获取 流程 使能记录 记录脏页 流程图 具体过程 获取脏页 流程图 具体过程 实验 QEMU在内存迁移阶段首先会标
  • kvm虚拟机读取宿主机usb设备

    1 查看usb设备 用lsusb查看宿主机usb设备信息 2 在kvm虚拟机的xml文件中添加如下
  • KVM无法进入virt-manager,提示Unable to init server: Could not connect: Connection refused

    1 KVM virt manager不能以root用户进入 需切换成普通用户或者sudo用户 2 需要配置ssh 密钥 3 需要安装Xming或者Xmanager等KVM可用等图形界面软件 无法连接kvm 设置用户到组 一定要当前用户不要r
  • KVM MMU EPT内存管理

    转载请注明 转载自博客xelatex KVM 并附本文链接 谢谢 注 文章中采用的版本 Linux 3 11 https www kernel org pub linux kernel v3 x linux 3 11 tar gz qemu
  • qemu-guest-agent windows下的监控开发

    windows下的qemu guest agent 简称qga 的名字叫做qemu guest agent win32 目前最新版的版本号是qemu guest agent win32 0 12 1 2 2 355 el6 4 9 x86
  • Android 模拟器在 Ubuntu 18.04 上因 SIGSEGV 崩溃

    Android Studio版本 Android Studio 3 1 2 内部版本 AI 173 4720617 建于 2018 年 4 月 14 日 它是从 Ubuntu 的 snap 商店安装的 我使用安装了kvm1 在 Ubuntu
  • 陷阱标志(TF)和监视器陷阱标志之间的区别?

    像 GDB 这样的调试功能通过设置 eflags 寄存器的 TF 标志来工作 这会在处理器每次执行指令后引发异常 让 gdb 等工具控制调试 当我们运行虚拟机 Ex 时 在 kvm 的情况下执行以下操作同样 您需要设置一个名为 MONITO
  • QEMU和KVM在虚拟机I/O中扮演什么角色?

    我发现 QEMU 和 KVM 之间的界限非常模糊 我发现有人说虚拟机是qemu进程 而另一些人说是kvm进程 究竟是什么 而QEMU和KVM在虚拟机I O中扮演什么角色呢 比如一个vm做PIO MMIO的时候 是qemu还是kvm会把它困住
  • 虚拟机上奇怪的程序延迟行为

    我编写了一个程序来读取 256KB 数组以获得 1 毫秒的延迟 该程序非常简单并附带 然而 当我在Xen上的VM上运行它时 我发现延迟不稳定 它具有以下模式 时间单位是ms totalCycle CyclePerLine totalms 2

随机推荐

  • 如何用 Python 获取实时的股票数据?

    这个我会 先上图 这篇回答中 我将向你展示两种不同的代码版本 加强版和一般版 代码运行环境说明 非常重要 Python版本要求 Python 3 需要安装的库 efinance 库的安装方法是 打开 cmd 命令提示符或者其他终端工具 输入
  • moshi 极简封装

    目录 前言 Jackson的基本使用 Jackson获取泛型类型的巧妙处理 借鉴jackson优化moshi的封装 使用 总结 前言 之前写了一篇文章是介绍moshi的基本使用和实战 感兴趣的可以先看一下对kotlin友好的现代 JSON
  • Linux命令:kill

    kill命令 终止某个指定PID的服务进程 root LAPTOP HJMUH10E home simon kill 97 killall命令 终止某个指定名称的服务所对应的全部进程 root LAPTOP HJMUH10E home si
  • ESP32S3学习——SPIFFS 文件系统

    芯片 esp32s3 开发环境 espidfv4 4 一 官网相关资料 1 简介 SPIFFS 是一个用于 SPI NOR flash 设备的嵌入式文件系统 支持磨损均衡 文件系统一致性检查等功能 2 说明 目前 SPIFFS 尚不支持目录
  • Unity3D课程——离散仿真基础

    解释游戏对象 GameObjects 和 资源 Assets 的区别与联系 区别 GameObject 是由unity创建的实例 在场景中所有实际使用的对象都是游戏对象 即出现在场景栏中的对象 Asset 是可以用于游戏中的具体资源 如脚本
  • 数字IC验证:ARM总线协议AMBA中AHB、APB的简介、区别与联系

    写在前面 最近实习项目里用到这2个协议 因此简单整理一下 内容大多来自ARM官方文档与网络上的 我主要做一个整合 加上自己的理解补充 内容来源都会分别标出 如有侵权请指出 立刻删帖 官方文档入口 AMBA 包括AHB ASB APB 文章目
  • RocketMQ-名词和架构

    RocketMQ rocketMQ是做什么的我就不用解释了吧 以及他的背景 本文主要是为了让大家明白RocketMQ的工作原理 架构图 上图 双箭头代表是双向通信 ProducerGroup和ConsumerGroup以及Broker集群
  • 常说的一区二区含义是什么?

    一区和二区是对于SCI期刊的划分 用于评估期刊的学术声誉和影响力 这种划分通常是指SCI期刊的影响因子 Impact Factor 范围 一区期刊 Q1 是指影响因子排名靠前的期刊 即影响因子在某个学科领域中排名前25 的期刊 一区期刊通常
  • 树(Tree)——(二)链式存储

    用代码实现前序 中序 后序 第一种方法就是使用递归 另一种是使用栈 将分别讲述 目录 1 递归实现 main函数 C语言版本 2 利用栈实现 mystack h mystack cpp main函数 3 补充 求树高度的函数 1 递归实现
  • Charles抓取https请求及常见问题解决

    大家好 我是杨叔 每天进步一点点 关注我的微信公众号 程序员杨叔 获取更多测试开发技术知识 一 背景 APP测试的时候 通常都需要通过抓包工具抓取各类请求 查看接口的入参 返回值等 用于分析定位问题 常用的抓包工具有fiddler char
  • [C/C++]相对路径&绝对路径 斜杠&反斜杠的区别

    文件路径 正斜杠和反斜杠 正斜杠 又称左斜杠 符号是 反斜杠 也称右斜杠 符号是 文件路径的表示可以分为绝对路径和相对路径 绝对路径表示相对容易 例如 pDummyFile fopen D vctest glTexture texture
  • RocketMq存储设计——Index file

    RocketMq存储设计 Index file index file设计 rocket mq存储设计
  • 用python写入csv时的writerow()和writerows()函数

    目录 writerow 函数 writerows 函数 writerow 函数 csv文件是一个行之间元素用逗号隔开 结尾的时候时用换行符隔开的一种格式 往csv文件中输入的格式通常是列表 数组 如果输入的列表是一维的 那么就可以用writ
  • Servlet3.0特性详解-笔记

    Servlet3 0特性详解 笔记 Apache官方对各版本的解释 Servlet Spec JSP Spec EL Spec WebSocket Spec Apache Tomcat version Actual release revi
  • amd音频驱动不可用_教程:怎么安装更新NVIDIAAMD显卡驱动?

    PART 1 装驱动这么简单的事情真的需要写教程吗 我自己都理解不了我为什么要写这样一个教程 但是如你所见 他确实被我写出来了 而且对大部分人都挺有用 首先 使用鲁大师以及驱动精灵这类软件的同学自己喜欢就好 导致的任何问题也请你们自己解决
  • 计组cpi与mips的计算方法

    cpi CPI Clock cycle Per Instruction 表示每条计算机指令执行所需的时钟周期 有时简称为指令的平均周期数 可以用来表示CPU的性能 补充一下时钟周期的概念 1个时钟脉冲所需要的时间 在计算机组成原理中又叫T周
  • 数据结构实验--排序算法应用及对比

    一 课程设计题目与要求 排序算法应用及对比 基本要求 1 生成三组1000万个数 分别为随机数 基本正序 所有元素在正序的基础上整体左移2位 逆序 用什么数据结构 如果数据量达到1亿 10亿怎么办 2 实现快速排序 改进版 归并排序和堆排序
  • c语言鸡兔同笼的程序,C语言:鸡兔同笼问题

    鸡兔同笼 已知鸡兔总头数为h 设为30 总脚数为f 设为90 求鸡兔各几只 代码一 include main int h f x y printf 请输入总头数和总脚数 scanf d d h f x 2 h f 2 y f 2 h pri
  • 2020-2023年 近期出去面试Java的总结(持续更新)

    近期出去面试Java的总结 一 Java基础 1 Java的类加载顺序 对于有继承关系的加载顺序 2 Java的创建对象的几种方式 1 使用new关键字 2 使用反射机制 1 使用Class类的newInstance方法 2 使用Const
  • KVM初始化过程

    之前打算整理一下在Guest VM KVM QEMU中IO处理的整个流程 通过查阅资料和阅读源码 已经大致知道IO在Guest KVM中的处理流程 当想要整理IO在KVM和QEMU中的处理时 发现很难理清楚QEMU和KVM之间的跳转和交互的