qemu到kvm的处理,再到vm的运行
1、QEMU创建虚拟机发起:kvm_ioctl(s, KVM_CREATE_VM, type);
KVM中kvm_dev_ioctl判断参数-》kvm_dev_ioctl_create_vm-》kvm_create_vm该函数中创建并初始化了对应qemu模拟的内存条模型kvm->memslots【kvm结构体】
2、QEMU创建vcpu发起:kvm_vm_ioctl(s, KVM_CREATE_VCPU, (void *)kvm_arch_vcpu_id(cpu));
KVM中kvm_vm_ioctl判断参数-》kvm_vm_ioctl_create_vcpu-》
(1)kvm_arch_vcpu_create借助kvm_x86_ops->vcpu_create即vmx_create_vcpu完成任务:(1.1)kvm_vcpu_init初始化,主要是填充结构体【kvm_vcpu】,注意vcpu->run分派了一页内存,该函数继续kvm_arch_vcpu_init负责填充x86 CPU结构体【kvm_vcpu_arch】,该函数还kvm_mmu_create则是初始化MMU的函数,每个MMU都是vcpu独有。(1.2)分配一页给vmcs(执行vm entry的时候将vmm状态保存到vmcs的host area,并加载对应vm的vmcs guest area信息到CPU中,vm exit的时候则反之,vmcs具体结构分配由硬件实现,程序员只需要通过VMWRITE和VMREAD指令去访问)(1.3)vmx_vcpu_load加载VCPU的信息,切换到指定cpu,进入到vmx模式,将loaded_vmcs的vmcs和当前cpu的vmcs绑定到一起(1.4)vmx_vcpu_setup则是初始化vmcs内容,主要是赋值计算
(2)kvm_arch_vcpu_setup-》kvm_x86_ops->vcpu_load(vcpu, cpu)即vmx_vcpu_load,就是进入vcpu模式下准备工作。
(3)create_vcpu_fd为proc创建控制fd,让qemu使用
3、QEMU要运行vcpu发起:kvm_vcpu_ioctl(cpu, KVM_RUN, 0);
KVM中kvm_vcpu_ioctl判断参数-》kvm_arch_vcpu_ioctl_run-》__vcpu_run-》
(1)在while循环里面调用vcpu_enter_guest进入guest模式,该函数(1.1)首先处理vcpu->requests,对应的request做处理,kvm_mmu_reload加载mmu,通过kvm_x86_ops->prepare_guest_switch(vcpu)准备陷入到guest,prepare_guest_switch实现是vmx_save_host_state,顾名思义,就是保存host的当前状态(1.2)然后加载guest的寄存器等信息,fpu,xcr0,将vcpu模式设置为guest状态,屏蔽中断响应,准备进入guest。但仍进行一次检查,vcpu->mode和vcpu->requests等,如果有问题,则恢复host状态。(1.3)kvm_guest_enter做了两件事:account_system_vtime计算虚拟机系统时间;rcu_virt_note_context_switch对rcu锁数据进行保护,完成上下文切换。(1.4)准备工作搞定,kvm_x86_ops->run(vcpu),开始运行guest,由vmx_vcpu_run实现,该函数主要是内联汇编。(1.5)vmx_vcpu_run退出后返回到vcpu_enter_guest通过hw_breakpoint_restore恢复硬件断点(1.6)走到kvm_x86_ops->handle_exit(vcpu);即vmx_handle_exit处理虚拟机的退出:主要设置vcpu->run->exit_reason,让外部感知退出原因,并对应handle_exit函数集处理(有handle_task_switch进行任务切换,handle_io处理qemu的外部模拟IO等)。
(2)退回到__vcpu_run函数,在while (r > 0)中,循环受vcpu_enter_guest返回值控制,只有运行异常的时候才退出循环,否则通过kvm_resched一直运行下去。
(3)再退就到了kvm_arch_vcpu_ioctl_run函数,return到kvm_vcpu_ioctl,就ioctl返回到qemu的kvm_cpu_exec中,此时kvm run的执行也结束。
4、QEMU初始化虚拟机内存发起:kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
KVM中kvm_vm_ioctl把参数copy_from_user复制后-》kvm_vm_ioctl_set_memory_region逐层调用到__kvm_set_memory_region在KVM中建立与QEMU相对应的内存槽结构-》
(1)id_to_memslot根据qemu的内存槽号得到kvm结构下的内存槽号 kvm_memory_slot,转换关系来自id_to_index数组(在kvm_create_vm虚拟机创建过程中,kvm_init_memslots_id初始化对应关系slots->id_to_index[i] = slots->memslots[i].id = i)。
(2)根据slot中的值和要设置的值,决定要操作的类别KVM_MR_CREATE/DELETE/MOVE/_FLAGS_ONLY。如果是CREATE则kvm_arch_create_memslot函数,里面主要是一个循环做了一个3级软件页表;无论删除还是移动, 先申请一个slots,把kvm->memslots暂存到这里,通过id_to_memslot获取kvm_memory_slot,并将应标记为KVM_MEMSLOT_INVALID,然后是install_new_memslots,其实就是更新了一下slots->generation的值(也就是把刚新申请的slots装载到kvm->memslots)(这里为何先不用原来slot而是申请新的slot “如果添加的section的属性变了,如从RAM变成了ROM,那么重新进行添加也是必要的”并不理解https://blog.csdn.net/leoufung/article/details/48781185 )。
qemu到kvm的处理,再到vm的运行的更多相关文章
- Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- Qemu,KVM,Virsh傻傻的分不清
当你安装了一台Linux,想启动一个KVM虚拟机的时候,你会发现需要安装不同的软件,启动虚拟机的时候,有多种方法: virsh start kvm命令 qemu命令 qemu-kvm命令 qemu-s ...
- Qemu创建KVM虚拟机内存初始化流程
转载请注明:[转载自博客xelatex KVM],并附本文链接.谢谢. [注]文章中采用的版本: Linux-3.11,https://www.kernel.org/pub/linux/kernel/ ...
- QEMU和KVM的关系
首先KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它能够让Linux主机成为一个Hypervisor(虚拟机监控器).在支持VMX(Virtual Machin ...
- 014-通过JDB调试,通过HSDB来查看HotSpot VM的运行时数据
一.JDB调试 在预发环境下进行debug时,时常因为工具和环境的限制,导致debug体验非常差,那么有什么方法能够简化我们进行debug的体验吗?JDB就是一种. JDB ...
- 【记录】尝试用QEMU模拟ARM开发板去加载并运行Uboot,kernel,rootfs【转】
转自:https://www.crifan.com/try_use_qemu_emulate_arm_board_to_load_and_run_uboot_kernel_rootfs/ [背景] 手 ...
- kvm初体验之五:vm连接网络的两种方式:bridge和nat
1. 在安装vm时指定网络连接方式 1)bridge virt-install --name vm1 --ram=1024 --vcpus=1 --disk path=/vm-images/vm1,s ...
- kvm初体验之三:vm的安装及管理
Host: CentOS release 6.4 (Final) Guest: CentOS release 6.6 (Final) 全程以root身份操作 1. host上创建桥br0 参考< ...
- Qemu/Limbo/KVM镜像:Ubuntu Mate 22.04+Wine 7.8
链接: https://pan.baidu.com/s/1cf2c_ylu7-SUaYl8ddztog 提取码: b9mi 密码 空格 手机推荐使用termux里面的Qemu运行,速度最快. 镜像特征 ...
随机推荐
- Appium-Python-Windows环境搭建笔记
Appium版本:1.11.0 操作系统:Windows7-64位 开发语言:Python 3.7.2 测试应用平台:安卓 5.1.1 Appium服务端 一.JDK 也许你会觉得很奇怪,我搭建Pyt ...
- 用ImageJ快速分析和处理图像
ImageJ是一款由美国国立卫生研究院(NIH)开发的软件,原名NIH Image,适用于McIntosh.Windows和Linux等系统.ImageJ旨在对图像进行更好的分析和处理,可以下载或在线 ...
- 寻找真正的入口(OEP)--广义ESP定律
1.前言 在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,ESP定律的原理是什么,如何使用ESP定律?看到了我在“”调查结果发现,大家对ESP定律很感兴趣,当然因为实在是太好用了 ...
- 输入URL地址到页面加载完成 过程
在浏览器的地址栏中输入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去访问服务器上的1.jsp这个web资源的过程 1.浏览器根 ...
- L1-039. 古风排版
L1-039. 古风排版 中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数.第二行给出一 ...
- JAVA学习笔记 (一、入门及前期准备)
博主本来只是会一点python,但是换了新公司这边用的java,边学习边总结吧,共勉之. 一.认识 java (1)java分为三类 JavaSE 基础核心 JaveEE web方向(企业版) Jav ...
- 【Vagrant】-NO.130.Vagrant.2 -【Error:the filesystem "vboxsf" is not available】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 如何从零开始系统化学习视觉SLAM?
由于显示格式问题,建议阅读原文:如何从零开始系统化学习视觉SLAM? 什么是SLAM? SLAM是 Simultaneous Localization And Mapping的 英文首字母组合,一般翻 ...
- C#设计模式(13)——代理模式(Proxy Pattern)(转)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- Go 初体验 - 并发与锁.1 - sync.Mutex 与 sync.RWMutex
==== Mutex为互斥锁,顾名思义,被Mutex锁住的代码同时只允许一个协程访问,其它协程进来就要排队 如何使用?看代码: 输出: 释义: 并发1000个协程同时更改m的元素,这样会有一部分更改成 ...