kvm_emulate_hypercall代码解析()

关于hypercall的实现 <br />      本来只是实验室project中的一个部分,但是我觉得自己从中学到了很多东西~<br />      我想hypercall应该不需要再介绍什么了吧,其实它真的和system call挺像的,我在网上搜了下,关于hyper call的实现我能收到的比较详细的是用iocol来调用privcmd中实现的hypercall的方法,那个do_print_string 应该也算是我写的第一个hypercall了吧~这里是这种方式的hypercall的链接,我想网上对于这种方法已经讲的很详细了,这 阅读详情

功能概述

kvm_emulate_hypercall 是 KVM(Kernel-based Virtual Machine)中处理虚拟机发起的 超级调用(Hypercall) 的核心函数。Hypercall 是虚拟机(Guest)向宿主机(Host)请求特权操作的机制,类似于系统调用(但针对虚拟化场景)。

csv_init
    ops->handle_exit = csv_handle_exit;
vcpu_run
    vcpu_enter_guest
		svm_x86_ops
		    handle_exit
		        svm_invoke_exit_handler
		            svm_exit_handlers
		                vmmcall_interception
		                    kvm_emulate_hypercall
		                        kvm_pv_psp_copy_forward_op

输入参数

  • struct kvm_vcpu *vcpu:表示当前发起 Hypercall 的虚拟 CPU(vCPU)。

执行流程

1. Hyper-V 兼容性检查
if (kvm_hv_hypercall_enabled(vcpu->kvm))
    return kvm_hv_hypercall(vcpu);
  • 如果启用了 Hyper-V 兼容模式,直接调用 Hyper-V 的 Hypercall 处理函数。

2. 读取寄存器参数

从 vCPU 的寄存器中读取 Hypercall 的编号和参数:

nr = kvm_rax_read(vcpu); // Hypercall 编号
a0 = kvm_rbx_read(vcpu); // 参数 0
a1 = kvm_rcx_read(vcpu); // 参数 1
a2 = kvm_rdx_read(vcpu); // 参数 2
a3 = kvm_rsi_read(vcpu); // 参数 3
  • x86 约定:Hypercall 编号通过 RAX 传递,参数通过 RBX, RCX, RDX, RSI 传递。

3. 模式检查(32/64 位)
op_64_bit = is_64_bit_hypercall(vcpu);
if (!op_64_bit) {
    nr &= 0xFFFFFFFF; // 截断为 32 位
    a0 &= 0xFFFFFFFF;
    a1 &= 0xFFFFFFFF;
    a2 &= 0xFFFFFFFF;
    a3 &= 0xFFFFFFFF;
}
  • 根据 vCPU 模式(32/64 位)决定是否截断参数的高 32 位。

4. 特权级检查
if (kvm_x86_ops.get_cpl(vcpu) != 0 && ...) {
    ret = -KVM_EPERM;
    goto out;
}
  • CPL(Current Privilege Level) 必须为 0(内核态),否则返回权限错误(-EPERM)。
  • 例外:允许 KVM_HC_VM_ATTESTATION 等特定 Hypercall 在非特权级调用。

5. Hypercall 分发与处理

通过 switch (nr) 分发到具体操作:

  • 典型 Hypercall 示例:
    • KVM_HC_VAPIC_POLL_IRQ: 虚拟中断轮询(直接返回成功)。
    • KVM_HC_KICK_CPU: 唤醒指定 vCPU(需启用 KVM_FEATURE_PV_UNHALT)。
    • KVM_HC_CLOCK_PAIRING: 时钟同步(仅 x86_64)。
    • KVM_HC_MAP_GPA_RANGE: 映射 Guest 物理地址范围(需用户空间处理)。

6. 用户空间处理(以 MAP_GPA_RANGE 为例)
vcpu->run->exit_reason = KVM_EXIT_HYPERCALL;
vcpu->run->hypercall.nr = KVM_HC_MAP_GPA_RANGE;
...
vcpu->arch.complete_userspace_io = complete_hypercall_exit;
return 0;
  • 设置 KVM_EXIT_HYPERCALL 退出原因,并将参数传递给用户空间。
  • 用户空间处理完成后,通过 complete_hypercall_exit 回调恢复执行。

7. 返回值处理
out:
    if (!op_64_bit)
        ret = (u32)ret; // 32 位模式下截断返回值
    kvm_rax_write(vcpu, ret); // 结果写入 RAX
    ++vcpu->stat.hypercalls; // 统计计数器
    return kvm_skip_emulated_instruction(vcpu); // 跳过当前指令
  • 结果通过 RAX 返回给 Guest。
  • 更新 Hypercall 调用统计。

关键设计点

  1. 兼容性:

    • 支持 Hyper-V 和 KVM 原生 Hypercall。
    • 区分 32/64 位模式。
  2. 安全性:

    • 特权级(CPL)检查防止非法调用。
    • 参数合法性验证(如地址对齐)。
  3. 扩展性:

    • 通过 kvm_x86_ops 抽象架构相关操作(如 vm_attestation)。
    • 允许用户空间处理复杂 Hypercall(如内存映射)。

应用场景

  • 虚拟中断管理:唤醒其他 vCPU(KICK_CPU)。
  • 时钟同步:保证 Guest 与 Host 时间一致。
  • 安全认证:虚拟机证明(VM_ATTESTATION)。
  • 内存管理:动态调整 Guest 物理地址映射。

总结

kvm_emulate_hypercall 是 KVM 实现 Hypercall 的核心分发逻辑,结合特权检查、模式适配和用户空间协作,为虚拟机提供了与宿主机交互的安全通道。

从程序兼容性到全虚拟化:深入解析KVM/QEMU架构与实战 在计算机系统中,软件兼容性问题常源于可执行文件格式与CPU指令集不匹配,这本质上是平台不兼容问题。虚拟化技术通过创建隔离的虚拟机环境,为解决此类问题提供了系统级方案。其核心原理是利用CPU特权级别机制,通过陷入再模拟(Trap-and-Emulate)方式捕获并模拟客户机操作系统的特权指令,同时借助内存虚拟化技术为每个虚拟机提供独立的地址空间。全虚拟化的技术价值在于实现硬件资源的抽象与隔离,为云计算、服务器整合和安全沙箱提供基础设施支撑。应用场景涵盖从个人开发测试到企业级数据中心。本文以KVM/QEMU为例 阅读详情

相关推荐

深入 ‘Hypercall’:Guest OS 是如何像发起系统调用一样向 Hypervisor 请求服务的?

各位来宾,各位技术同仁,下午好!今天,我们将深入探讨虚拟化技术中一个至关重要的概念——Hypercall。在现代数据中心和云计算环境中,虚拟化无处不在,而 Hypercall 正是连接虚拟世界与真实硬件世界的核心机制之一。我们将聚焦于一个核心问题:Guest OS(客户操作系统)是如何像发起传统系统调用一样,向 Hypervisor(虚拟机监控器)请求服务的?这不仅仅是一个技术细节,它关乎虚拟化效率、安全以及客户操作系统与底层虚拟化环境协同工作的方式。

weixin_41455464的博客 349

内核虚拟化:hypercall

在Linux中,大家应该对syscall非常的了解和熟悉,其是用户态进入内核态的一种途径或者说是一种方式,完成了两个模式之间的切换;而在虚拟环境中,有没有一种类似于syscall这种方式,能够从no root模式切换到root模式呢?答案是肯定的,KVM提供了Hypercall机制,x86体系架构也有相关的指令支持。

1470

43、虚拟化技术中的Hypercall与VMBus机制详解

本文详细介绍了虚拟化技术中的Hypercall与VMBus机制。Hypercall通过Hypercall页面实现,用于访客与虚拟机监控器(VMM)之间的高效通信,分为快与慢调用方式以及简单和重复(rep)类型。同时,文章深入解析了SynIC(合成中断控制器)及其相关MSR寄存器(如SynIC CONTROL MSR、SINT MSR、SIMP MSR等)的配置和用途。VMBus作为虚拟化环境中的通信机制,支持基于通道的设备通信,其流程包括初始化、设备报价请求、GPADL创建、通道打开及环形缓冲区数据交换。文

zz67890的博客 80

hypercall的实现机制

与系统调用类似,Xen中的hypercall是通过软中端(中断号0x82)来实现的: 超级调用号:xen/include/public/xen.h中定义了45个超级调用,其中有7个是平台相关调用。超级调用表:xen/arch/x86/x86_32/entry.S中定义了超级调用表,通过超级调用号索引就可以方便的找到对应的处理函数。超级调用页:超级调用页是Xen为Guest OS准备的一个页,可

sdulibh的专栏 2600

数据仓库建模的步骤-从需求分析到模型优化的全面指南

数据仓库建模是一个系统化的过程,旨在设计和构建一个高效、可扩展的数据存储和分析环境。它的目标是将来自不同源系统的数据整合到一个统一的、面向主题的、随时间变化的数据集合中,以支持企业的决策制定过程。数据仓库建模不仅仅是创建表格和定义关系,它更是一门艺术,需要平衡业务需求、技术限制和未来的可扩展性。提供快速的查询性能支持复杂的分析需求适应业务的变化和增长保持数据的一致性和准确性接下来,让我们深入探讨数据仓库建模的每个主要步骤。

一个8年大数据开发工程师的碎碎念 2101

资产监测设备中130dBm的GPS信号注入天线端口,C/N0一般是多少?

笔者的团队一直从事于资产监测设备的开发,在开发过程中,涉及到很多细节的问题,针对新入职的同事来说较为陌生。同时,在团队外,还有需要对智能硬件终端开发感兴趣的用户。基于此背景下,笔者将在下面的内容主要介绍资产监测设备以及对设备中的GPS相关的问题:130dBm的GPS信号注入天线端口,C/N0一般是多少?作出详细的解答。 资产监测设备概述: 资产监测设备是基于物联网通信技术基础上的智能硬件终端,其主要作用是帮助用户监测资产在仓库、运输途中、交付整个流通环节中,提供资产的实时位置与状态参数。用户只需要登录资产

瑞奇聊通信模组 1229

CPU纯软件半虚拟化技术

CPU纯软件半虚拟化技术

u011619480的专栏 1145

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 598

Hypercall

在Linux中,大家应该对syscall非常的了解和熟悉,其是用户态进入内核态的一种途径或者说是一种方式,完成了两个模式之间的切换;而在虚拟环境中,有没有一种类似于syscall这种方式,能够从no root模式切换到root模式呢?答案是肯定的,KVM提供了Hypercall机制,x86体系架构也有相关的指令支持。 [点击查看全文] http://luoye.me/2014/07/27/

白水煮鸡蛋 2507

citespace基本操作

聚类分析 时间线图 这些结果都是高被引文献的相关呈现结果,代表该领域的文献基础 下面可以看看该project的前沿领域 选择keywords 和term go! 调整显示方式 生成凸线图:表示 在某个研究领域或者时间段内 ,大家对某个领域或者某个词的关注度突然增高,凸显前沿方向的转变 以此来发现热点 ...

生信小博士的博客 1万+

RK3568 OpenHarmony3.2 NFC 驱动适配(PN7150)II

承接上文《RK3568 OpenHarmony3.2 NFC 驱动适配(PN7150)I》,继续PN7150 NFC模块的整体适配。本文主要介绍包括HDI实现层、框架层以及设备适配层的代码修改思路。具体包括vendor_adaptor、hdi_service等;以及foundation下的frameworks、services等。此外还包括相关三方库libnfc-nci在鸿蒙平台的移植和适配。需要注意的是,当前nfc适配只是基于作者手上的RK3568平台以及相关OpenHarmony3.2的代码。

Martian_Jonas的博客 1360

kvm的vmcall

这几个接口的区别在于参数个数的不用,本质是一样的。挑个参数最多的看下: 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_H...

weixin_34129145的博客 846

【YOLOv11工业级实战】15. YOLOv11海洋监测实战:珊瑚礁健康评估(水下图像增强|机器人搭载)

摘要:本文针对珊瑚礁健康评估的海洋监测需求,基于YOLOv11提出解决方案,聚焦水下色偏、悬浮物干扰、珊瑚形态复杂三大难题。引用全球珊瑚礁监测网络(GCRMN)标准,采用CoralNet数据集,通过Jaffe-McGlamery物理模型引导增强与悬浮物去除算法,在浑浊水域(能见度<5m)实现87.3%的健康珊瑚识别率,藻类误判率低至7.2%。介绍了以BlueROV2水下机器人和Jetson AGX Orin为核心的部署方案,结合水下SLAM定位技术,实现珊瑚健康的实时评估与三维覆盖率计算。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1644

Xen添加一个hypercall

Xen添加一个hypercall 在Xen中,hypercall(超调用)是一个比较重要的概念;hypercall类似于system call,hypercall之于xen hypervisor就像系统调用之于Linux kernel. 在x86平台上,Xen中的hypercall是通过软中端(中断号0×82)来实现的。 在linux系统中添加新的系统调用,一般需要三个步骤: 1. 注册新

cybertan的专栏 1878

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3547

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

KVM之Hypercall机制

这里只关注x86架构。 按内核文档中,x86架构下,KVM Hypercall是一个3字节的指令,vmcall指令或者vmmcall指令。 通过寄存器rbx、rcx、rdx、rsi,最多传输四个参数。然后hypercall的调用号存放于rax,并且调用返回值也存放于rax中,不涉及其他寄存器。 原理分析 VM调用接口 arch/x86/include/asm/kvm_para.h中定义了hypercall接口: #define KVM_HYPERCALL \ ALTERNATIVE("vmc

大吉 2489

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

物理机虚拟化关键技术介绍

本文介绍了基于单个物理机进行虚拟化的虚拟化技术原理、架构层次,虚拟化有裸金属和寄居架构两种架构种类,虚拟化技术分为全虚拟化、半虚拟化和硬件辅助虚拟化三种,物理机虚拟化关键技术包括CPU虚拟化、内存虚拟化、I/O虚拟化、网络虚拟化以及虚拟机的迁移和声明周期管理。

老猿Python 2582

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

虚拟化技术——cpu虚拟化

当虚拟机运行时,CPU虚拟化技术通过虚拟化处理器指令集、内存管理单元(Memory Management Unit, MMU)以及设备访问等方面的技术,将虚拟机对处理器、内存和其他硬件资源的请求转化为对物理计算机上相应资源的访问。在虚拟化的平台上,虚拟机(guest VM)所使用的多个虚拟CPU(简称vCPU)可能是共享同一个物理CPU(简称pCPU)的。VMM负责vCPU的调度,当一个vCPU获得pCPU的使用权后,基于该vCPU运行的guest OS就可以调度OS中的各个线程/进程。

tombaby_come的博客 7603

Xen API简介

Xen提供两种接口:一种是由客户机使用的,一种是由工具使用的,前者就是熟知的Hypercall,后者被称之为Xen的API,有时候也被称之为Xen的管理API,Xen的API构建在XML-RPC之上,完整的API规范超过100页。Xen的API被用户空间组件使用,比如用来控制系统的xm命令行工具,Xend后台进程监听XML-RPC连接并执行一些管理功能。 XML-RPC 和绝大多数程序设计语言一样

修电脑的码农 2602

KVM内核文档阅读笔记

KVM在内核中有丰富的文档,位置在Documentation/virtual/kvm/。 00-INDEX:整个目录的索引及介绍文档。 api.txt:KVM用户空间API,所谓的API主要是通过ioctl来实现的。 cpuid.txt:KVM的cpuid相关API。 devices/:各种平台相关设备API。 hypercalls.txt:KVM的hypercall介绍,介绍了X86和S390的...

weixin_34315189的博客 236

KVM中的Hyper-V接口

前言 从Windows 7开始,微软为了使Windows操作系统能够在自研的Hyper-V平台得到更好性能,在Windows操作系统内嵌了许多半虚拟化接口,这些半虚拟化接口通过TLFS规范对外公开。假设其他虚拟化平台(KVM、Xen、VMware)实现了和Hyper-V一样的接口暴露给Guest,那么Windows内部的半虚拟化特性也会被激活,此时这些虚拟化平台被称为Hyper-V兼容平台。KVM就是一个Hyper-V兼容平台,KVM提供了部分关键的兼容接口,本文将详细描述这些接口。 CPUID 在使

Nicholas的专栏 3615

全虚拟化下的超级调用

hvm实现超级调用

sploving的专栏 5093

linux 内核 - ioctl 函数详解

1. 概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 2. 用户空间 ioctl #include &...

岁月斑驳7的博客 18万+

hvm hypercall 2

A sample test module for the HVM hypercall interface. Signed-off-by: Steve Ofsthun 1) To use, put these files in a directory by themselves. 2) Edit the Makefile: Set XEN_ROOT to a populated xen

潘无穷 1091

Xen超级调用详细实现

概述:当虚拟机的Guest OS需要执行一些更高权限的操作(如:页表的更新、对物理资源的访问等)时,由于自身在非特权域无法完成这些操作,于是便通过调用Hypercall交给Xen Hypervisor来完成这些操作。与系统调用类似,Xen启用130号中断向量端口作为超调用的中断号。这一中断向量的DPL被设置为1,类型为中断门。超调用能够由处于特权级1的客户机操作系统发起,而不能从用户态发起。

YSBJ123的博客 2499
上一篇: CSV加密代码分析
下一篇: QEMU 中 x86_cpu_realizefn 到 ept_emulation_fault 的调用流程解析(macos)
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值