这几个接口的区别在于参数个数的不用,本质是一样的。挑个参数最多的看下:
static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,unsigned long p2, unsigned long p3, unsigned long p4)
{
    long ret;
    asm volatile(KVM_HYPERCALL
             : "=a"(ret)
             : "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)
             : "memory"); return ret;
}将由客户机调用该函数发生vmexit
 
执行asm汇编代码时,首先将 "a"(nr), "b"(p1), "c"(p2), "d"(p3), "S"(p4)输入,当执行KVM_HYPERCALL时,#define KVM_HYPERCALL ".byte 0x0f,0x01,0xc1",表示该指令序列为0F01C1,此时VMM根据vmx.c中的kvm_vmx_exit_handlers中将会调用handle_vmcall,调用kvm_emulate_hypercall进行相应操作,并将结果返回给RAX寄存器,并返回"=a"(ret)。hypercall是同步执行的,如果host中kvm_emulate_hypercall不返回(比如睡眠10秒),那么guest中kvm_hypercall也不会返回,直到host里睡眠结束。
 
如果想要在非根模式下运行的客户机的每一个IO指令都产生VM-Exit,那么可以将Use I/O bitmaps 比特位所在字段设置为0,同时将Unconditional I/O exiting字段设为1即可。这样的话在客户机中运行的每一个IO指令(IN, INS, INSB, etc, etc...)都将导致VM-Exit从而陷入到VMM中。但是如果我们将Use I/O bitmaps字段置1,则Unconditional I/O exiting就无效了。此时在客户机中运行的IO指令是否陷入到VMM中由IO位图(bitmap)来指定:如果IO指令访问的某一端口地址在IO bitmap中对应位为1,则该条指令导致VM-Exit,否则意味着该端口可以被客户机直接所访问而无需VMM的介入。
在vmx_init中,将vmx_io_bitmap_a设置为0xff全1(memset(vmx_io_bitmap_a, 0xff, PAGE_SIZE)),在vmx_vcpu_setup中将vmx_io_bitmap_a读入IO_BITMAP_A(vmcs_write64(IO_BITMAP_A, __pa(vmx_io_bitmap_a))),则将端口地址对应IO bitmap位设为1,执行该指令将导师vm-exit。
 
host对于即将到来的根模式非根模式切换所做的准备,vmx_create_vcpu->vmx_vcpu_setup->vmx_set_constant_host_state

kvm的vmcall的更多相关文章

  1. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  2. KVM 介绍(2):CPU 和内存虚拟化

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. [Mark] KVM 虚拟化基本原理

    X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring 是指 CPU 的运行级别,Ring 0 ...

  4. <Mastering KVM Virtualization>:第二章 KVM内部原理

    在本章中,我们将讨论libvirt.QEMU和KVM的重要数据结构和内部实现.然后,我们将深入了解KVM下vCPU的执行流程. 在这一章,我们将讨论: libvirt.QEMU和KVM的内部运作方式. ...

  5. KVM(二)CPU 和内存虚拟化

    1. 为什么需要 CPU 虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring 是指 ...

  6. kvm详细介绍

    KVM详解,太详细太深入了,经典 2016-07-18 19:56:38 分类: 虚拟化 原文地址:KVM详解,太详细太深入了,经典 作者:zzjlzx KVM 介绍(1):简介及安装 http:// ...

  7. KVM虚拟化知识的一些笔记

    一.KVM介绍 KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截.Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理. QEMU:修改过的为 KVM 虚机使 ...

  8. [ kvm ] 学习笔记 2:虚拟化基础

    1. 虚拟化概念 什么是虚拟化 虚拟化是使用所谓虚拟机管理程序从一台物理机上创建若干个虚拟机的过程.虚拟机的行为和运转方式与物理机一样,但它们会使用物理机的计算资源,如 CPU .内存和存储.虚拟机管 ...

  9. 虚拟化技术实现 — KVM 的 CPU 虚拟化

    目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...

随机推荐

  1. Qt 蓝牙部分翻译

    这是我第一次尝试翻译技术文档,自己英语太烂,一直不敢尝试,感谢生活,让我勇敢迈出这第一步. 大部分都是直译,如有不妥,还请制导. Qt Bluetooth The Bluetooth API prov ...

  2. 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)

    十月一的假期转眼就结束了,这个假期带女朋友到处玩了玩,虽然经济仿佛要陷入危机,不过没关系,要是吃不上饭就看书,吃精神粮食也不错,哈哈!开个玩笑,是要收收心好好干活了,继续写Faster-RCNN的代码 ...

  3. Hibernate 查询,返回结果设置到DTO

    1:原生sql的查询,返回结果设置到DTO: Query query = sessionFactoryRtData.getCurrentSession().createSQLQuery(hql.toS ...

  4. POJ 2161 Chandelier(动态规划)

    Description Lamps-O-Matic company assembles very large chandeliers. A chandelier consists of multipl ...

  5. 并查集——poj1611(入门)

    传送门:The Suspects 并查集水题 #include <iostream> #include <cstdio> #include <algorithm> ...

  6. android自定义View绘制圆形头像与椭圆头像

    要实现这两种效果,需要自定义View,并且有两种实现方式.   第一种: public class BitmapShaders extends View {     private  BitmapSh ...

  7. PAT 1084 外观数列

    https://pintia.cn/problem-sets/994805260223102976/problems/994805260583813120 外观数列是指具有以下特点的整数序列: d, ...

  8. Java集合整体框架

    Java中的集合类有List.Set.Map Collection的实现类:List.Set List的实现类:ArrayList.LinkedList.Vector Set的实现类:HashSet. ...

  9. 如何在MyEclipse下查看JDK源代码

    在MyEclipse中查看JDK类库的源代码~ 设置: 1.点 "window"-> "Preferences" -> "Java&quo ...

  10. CSS的基本使用

    CSS的出现就是为了将HTML的内容与样式分离 CSS的书写方式 selector{ key:value } h1{ color: blue; } <!DOCTYPE html> < ...