这几个接口的区别在于参数个数的不用,本质是一样的。挑个参数最多的看下:
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. nginx初探,下载安装配置负载均衡

    上一篇我讲了正向代理和反向代理的概念,这个是为nginx做准备的前置技能,网上百度nginx可以知道nginx是什么: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/PO ...

  2. LB

    LB(LBaaS)及Load Balance as a Service是 Neutron 提供的一项高级网络服务. LBaaS 允许租户在自己的网络中创建和管理 load balancer,load ...

  3. Nginx 配置 HTTPS自签名证书

    工具: OpenSSL ssl的开源实现,几乎实现了市面上所有的加密 libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库 libssl: TLS/SSL 加密库 openssl ...

  4. C++STL——set

    一.相关定义 set 集合,有唯一性,即每一个元素只有一个: 是一个有序的容器,里面的元素都是排序好的: 支持插入,删除,查找等操作. 注意 set中的元素可以是任意类型的,但是由于需要排序,所以元素 ...

  5. .aspx文件和.aspx.cs文件的区别与联系

    http://zhidao.baidu.com/link?url=_SNw0EHJ8Wg__KanJrKQM3tVEUeFnVilZ6GGIN8ab69RLuyOWD__WyZb7Zb9dJjwDnL ...

  6. 【历史】- .NET之父 - Anders Hejlsberg

    简介 安德斯·海尔斯伯格(Anders Hejlsberg,1960.12~),丹麦人,Turbo Pascal编译器的主要作者,Delphi和.NET之父! 安德斯·海尔斯伯格曾在丹麦技术大学学习工 ...

  7. 不错的PDF开发库

    C++库: 1,PDF类库 PoDoFo   http://podofo.sourceforge.net/  PoDoFo 是一个用来操作 PDF 文件格式的 C++ 类库.它还包含一些小工具用来解析 ...

  8. Flink State的两张图

    streamTask的invoke方法中,会循环去调用task上的每个operator的initializeState方法,在这个方法中,会真正创建除了savepointStream的其他三个对象, ...

  9. online community

    online community spectrum https://spectrum.chat/xgqfrms https://community.xgqfrms.xyz/ https://spect ...

  10. Luogu3952 NOIP2017时间复杂度

    搞一个栈模拟即可.对比一下和一年前考场上的代码233 //2018.11.8 #include<iostream> #include<cstdio> #include<c ...