LWN: KVM guest 里的私有内存!

The state of guest_memfd 在有硬件支持的实现中,主机如果尝试访问 guest 的私有内存,甚至可能触发机器检查,导致系统崩溃。仍可以通过将私有内存从主机的 direct map(直接映射)中移除,来实现一定程度的设备隐私保护,使得主机无法对其寻址。然而,主机依然保留对这部分内存的访问权限,这意味着它可以轻松地查看这些内存中的数据,即便这些数据是虚拟机希望保密的。子系统中分配内存,但随后将其转换为普通 folio,如果需要,可以将其映射或拆分,以便将其中较小的部分在共享与私有之间转换。但如果主机尝试访问私有页,依然会触发总线错误。 阅读详情

关注了就能看到更多这么棒的文章哦~

Private memory for KVM guests

By Jonathan Corbet
April 7, 2022
DeepL assisted translation
https://lwn.net/Articles/890224/

云计算是很美妙的;它可以更加有效地利用好计算系统,并使虚拟机在点击鼠标或调用 API 时立即就准备好。但是云计算也会有问题;虚拟机的安全性取决于 host 系统的安全性。在当前世界上部署好的大多数系统中,host 可以随意查看其 guest 的内存,运行 guest 系统的那些用户只能寄希望于 host 不会去这么做。对于这个问题正在开发一些解决方案,包括 Chao Peng 等人准备的 KVM guest-private memory patch set,但仍有一些问题没有解决。

基于 KVM 的 hypervisor 在 host 系统上运行时是作为一个用户空间进程的。为了给 guest 提供内存,hypervisor 在 host 上分配内存,然后使用各种 KVM ioctl()调用将其映射到 guest 的 "物理" 地址空间。但是,hypervisor 也保留了它对这部分内存的 mapping,完全可以访问到这部分内存。有些情况下有必要使用这种访问权限,用来进行 guest 和 hypervisor 之间的通信,但是 guest 很可能想把大部分内存留给自己私人使用。

Providing private memory

这个问题的解决方案提案利用了内核的 memfd 机制。hypervisor 可以通过利用新增的 MFD_INACCESSIBLE 标志来调用 memfd_create(),为其 guest 设置一个私有内存区域。这创建了一个特殊类型的 memfd,创建者对它不能进行任何操作,也就是读取或写入都将失败,也无法将它映射到内存中。如果还使用了 MEMFD_SECRET 标志,那么 host 对受影响的这些 page 的 direct mapping 也将被移除,这意味着 host 内核也将没有对该内存的映射,即使 host kernel 被攻破,也很难访问到这部分内存内容。

还有一件事可以做,就是把它交给 KVM,让 KVM 来把这个区域映射到 guest 的虚拟地址空间。这样一来,guest 就可以拥有对这部分内存的完全访问权限,尽管 host(尽管它是对这部分内存进行配置的人)却无权访问。启用这个功能需要在 KVM 以及实际提供内存的 backing store(可能是 shmfs)之间设置双向 callback。第一组操作是在 KVM 方面提供的:

struct memfile_notifier_ops {
  void (*invalidate)(struct memfile_notifier *notifier,
                     pgoff_t start, pgoff_t end);
  void (*fallocate)(struct memfile_notifier *notifier,
                    pgoff_t start, pgoff_t end);
};

每当把内存被映射到这个内存区域时,fallocate() 函数就会被调用,如果 host 端是在使用 fallocate()系统调用时。值得注意的是,Dave Chinner 反对这个名字,所以这个 callback 很可能最终被命名为 notify_populate() 之类的。invalidate() callback 则是用来表明一系列 page 已经被删除了,不能再从 guest 那里访问到了。

其他 callback 是由 backing-store 具体实现方案来提供的,从而可以让 KVM 能够访问这个本来无法访问的 memfd 中的内存:

struct memfile_pfn_ops {
  long (*get_lock_pfn)(struct inode *inode, pgoff_t offset, int *order);
  void (*put_unlock_pfn)(unsigned long pfn);
};

KVM 将调用 get_lock_pfn() 来获取一个或多个 page 的 hostpage-frame number。当 KVM unmap page 时,它会调用 put_unlock_pfn()来通知 backing store,这些 page 不再被使用。

这种机制,再加上 KVM 中必要的一些基础设施,就足以为 guest 提供 private memory 了。hypervisor 将为 guest 分配该内存,但不能以任何方式访问到它。

Conversion

Quentin Perret 提出了一个相关的问题:当 guest 想与 host 共享一些 private memory 时,会发生什么?这种情况经常发生(例如,配置 I/O buffer 的时候),因此类似的大多数解决方案都提供了一种机制,用于把这些 memory page 的状态在 private 和 shared 状态之间来回切换(conversion)。Perret 问道,这种机制要是如何处理。

Sean Christopherson 提供的答案是,guest 通过以 KVM_EXIT_MEMORY_ERROR 状态退出 hypervisor 来表示希望转换 page 状态。这个返回值将被传回 hypervisor[更新:感谢 Paolo Bonzini 提供了下面这段解释的修订版本。]

Sean Christopherson 提供的答案是,guest 用一个 hypercall 来表示希望转换 page。KVM_RUN ioctl() 立即以 KVM_EXIT_MEMORY_ERROR 状态返回给用户空间的 hypervisor 进程,如果它同意该请求,就可以把不可访问的 memfd 的相关部分进行 unmap 来实现。这也是通过 fallocate(),使用 "hole-punch" 功能完成的。然后,hypervisor 可以将普通内存映射到新创建的空洞之中,从而产生一个双方都能访问的内存区域。

需要注意的一件事是,从设计上来说,将 page 共享给 host 是一个破坏性的操作,hole-punch 操作将导致存储在那里的数据消失。正如 Christopherson 所描述的那样,这种行为与一些硬件实现的行为很吻合,page 要先被 share 给 host,然后才能在其中填写需要共享的数据。Perret 正在为 Android 开发一个类似的机制("protected KVM " 或 pKVM),他更希望有一个 in-place conversion 机制。他说,如果没有这个机制,这个解决方案就 "可能不那么适合 pKVM"。他列举了一连串的理由,其中包括:

pKVM 的一个目标是将一些东西(如 DRM 等)从 Arm Trustzone 环境迁移到受保护的 VM 中。这将给 Linux 一个抵御来自这部分的攻击的机会,毕竟目前来说这些功能是可以访问到所有内存的。在 Linux 和 Trustzone(donations and shares)之间转换 page 是快速并且不是破坏性的,所以我们真的不希望 pKVM 通过要求 hypervisor 来 memcpy 东西来变得更差。

Christopherson 质疑是否必须要做非破坏性转换(non-destructive conversion),他认为就算是修改 pKVM 来处理破坏性转换(destructive conversions) "似乎并不太麻烦"。Andy Lutomirski 也不确定这个要求是否真的有好处,并担心正确实现会有不小的难度:

如果我们真的想支持同一个 page 在共享和私有状态之间的转换,那么我们的情况就有点尴尬了。从私有到共享在概念上是很容易的,做一些记录,重新创建 direct map 里的 entry,然后就完成了。但是反过来则是一团乱:所以之前正在使用该 page 的地方都需要先被停下来。如果该 page 最近被用于 DMA 的话,这就还要包括清理 IOMMU entry。

Perret 重申了他的想法,也就是 in-place conversion 会更加有用,但他承认他自己(也包括所有其他参与讨论的人)目前都还没有收集到数据来证明这一点。他也没有想清楚 in-place conversion 的细节问题,尽管他提出了一个关于这个功能如何实现的大概想法。

截至目前,讨论仍在进行,没有明确的解决方案。涉及到的开发者都有兴趣创建一个适用于所有使用场景的机制,他们都不愿意增加几种 private memory 的实现。但是他们都希望在避免过度复杂化的同时能获得最好的性能。协调并达成这样的目标,正是 system program 也就是系统编程(以及大多数其他类型编程开发)的核心,也是内核社区通常比较擅长的事情。至少,如果所有感兴趣的各方都能参与到讨论中的话。开发者们已经开始讨论,所以,运气好的话有望从这个讨论中得到一个可行的解决方案,但这可能还需要一段时间。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

6fc9a6376f010544f5d2eaf39650d233.png

kvm内存管理之获取guest内存分布 一 KVM内存管理机制 (在此先只讲qemu如何让KVM获取非root的客户机的内存分布:事实上还没有与物理上形成映射,只是在qemu进程的线性空间中开辟一块区域) KVM不改变GUEST OS,而操作系统对内存的基本认识包括: 1.        物理地址从0开始;(eg, 0~4G) 2.        存在连续性;(4KB为一页,按页组织) 同一个host中,要满足多个guest 阅读详情

相关推荐

ARM64 KVM工作流程分析

基本介绍         在kvm虚拟机正常的运行的过程中,guest os正常执行,就好像它在一个物理机上执行一样。当guest执行到敏感指令时,就需要KVM来进行敏感指令的模拟和IO的处理了。因此不严格的可以说KVM的工作(对系统进行虚拟化)主要就是通过对guest的退出进行处理来完成的。本文就讲述ARM64平台K...

sungeshilaoda的博客 4102

KVM,pKVM on arm64

本文适合对KVM构架和arm CPU构架有一定了解的读者。讲解non VHE KVM, VHE KVM和Protected KVM 查看原文: https://mp.weixin.qq.com/s/UhZoNayBlc8tzBgqv9n1RA KVMon arm64 – non VHE mode 在armv8/v9non VHE模式时,kvm部分运行在hostkernel@EL1,部分运行在EL2. 在hostkernel里面的KVM当成其kernel module, 主要负责给VM分配管理内存,创建VM

weixin_39366778的博客 3761

单细胞拟时序分析实战:用monocle2从Seurat对象构建细胞轨迹(附完整代码)

本文提供了一套完整的单细胞拟时序分析实战教程,详细讲解了如何将Seurat对象转换为Monocle2的CellDataSet,并构建细胞命运轨迹。内容涵盖数据转换、轨迹定义基因选择、降维参数调优、可视化技巧及结果生物学验证,旨在帮助研究者解决实际分析中的常见问题,从静态细胞图谱中挖掘动态发育过程。

weixin_29251337的博客 342

KVM Forum 2022应该关注的话题

第15届KVM论坛于2022年9月12日至9月14日在爱尔兰都柏林会议中心举行。KVM Forum2022有哪些指的关注的技术,KVM未来发展方向如何,有哪些激动人心的想法,让我们一睹为快。

rayylee 1646

new delete 详解

常规的new 和 delete 当需要内存时,可以使用new申请内存,但在用完内存时应当使用delete 去归还内存,以防止内存泄漏,具体使用方案见下面代码: int* ps = new int ; // 使用new 申明变量空间 ... ... delete ps ; '// delete 删除所申明的变量空间 上述代码将删除ps 指针指向的内存空间,但不会删除指针本身,即仍然可以使用该指针去指向其他int 类型的变量。new 和 delete 一定需要成对的使用否则极易发生内存泄漏。 注意:不

qq_42138448的博客 6938

TCS34725颜色识别模块实战调校:从“一坨”例程到精准RGB

本文针对TCS34725颜色识别模块初始数据不准的问题,提供了从基础例程到精准调校的实战指南。核心在于通过白光校正与黑白光校正两种方法,补偿传感器偏差与环境光影响,将原始数据准确映射为标准RGB值。文章详细阐述了校准原理、操作步骤与代码实现,并分享了进阶调试技巧与避坑指南,帮助开发者显著提升颜色识别的准确性与项目可靠性。

weixin_29188043的博客 287

LWN:Android上使用KVM!

关注了就能看到更多这么棒的文章哦~KVM for AndroidBy Jake EdgeNovember 11, 2020KVM Forum(https://lwn.net/Archiv...

Linux News搬运工 1万+

智能循迹小车之PID控制算法

从光电传感器获取信号确认小车和黑线的偏离角度,通过PID算法算出左右车轮速度,控制小车前进或者后退。

yzj199921的博客 4639

LWN:KVM使用Guest-first memory!

关注了就能看到更多这么棒的文章哦~Guest-first memory for KVMBy Jonathan CorbetNovember 2, 2023ChatGPT translationhttps://lwn.net/Articles/949277/保护计算(confidential-computing)实现的核心目标之一是保护客户(guest)系统的内存免受来自客户本身之外的其他使用者的访...

Linux News搬运工 1243

USB PD快充功率监测仪:高精度嵌入式USB电压电流测量终端

USB供电已从数据接口演进为关键电源总线,尤其在PD快充场景下,工程师亟需对5V–20V宽压范围内的实时电压、电流及瞬时功率进行精准捕获。其底层原理依赖高共模抑制比的高边电流检测与分压采样+ADC数字化处理,结合LDO低噪声供电保障模拟链路精度。该类设备的技术价值在于以低成本实现协议无关的‘电气层可视化’,规避商用ASIC测试仪的黑盒局限,支撑PD充电验证、电源设计调试与教学实验等工程实践。本文介绍的开源USB表即基于N32G430 MCU与INA199电流检测芯片,覆盖USB-C输入/输出双通道监测,具备

weixin_42174098的博客 207

单总线协议(1—Wire bus)【DS2431】

1—Wire 协议定义了复位脉冲、 应答脉冲、写0、写1、读0和读1时序等几种信号类型。所有的单总线命令序列(初始化ROM 命令功能命令)都是由这些基本的信号类型组成的。识别单总线器件(ROM 命令)单总线器件交换数据(功能命令)初始化单总线器件(初始化)

qq_41883039的博客 1144

LWN:改进KVM来增强guest系统保护和安全!

点击上方蓝色“Linux News搬运工”关注我们~Enhancing KVM for guest protection and securityNovember 20, 2019Thi...

Linux News搬运工 442

CosyVoice语音合成使用教程

CosyVoice是一款开源的语音合成工具,它基于深度学习模型,能够生成高度逼真的语音内容。该工具支持多种语言的语音生成,包括中文、英文、日文、粤语和韩语。CosyVoice的亮点在于它对生成语音情感和韵律的精细控制,通过富文本或自然语言输入,可以显著提升合成语音的情感表达能力。CosyVoice提供了多种预训练模型,用户可以根据需求选择合适的模型。:基底模型,适用于一般语音合成任务。:经过SFT微调的模型,适用于特定音色和情感的语音合成。:支持Instruct微调的模型,适用于自然语言控制的语音合成。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 4442

LWN:从KVM直接进行host系统调用!

关注了就能看到更多这么棒的文章哦~Direct host system calls from KVMBy Jonathan CorbetJuly 29, 2022DeepL assisted translationhttps://lwn.net/Articles/902585/虚拟化机制的设计原则之一就是要在 host 和它所运行的 guest 系统之间提供强大的隔离。guest 是不可以被信任...

Linux News搬运工 504

华为 MetaERP 集成盘古大模型、天筹 AI 求解器等生成式 AI 相关技术能力,结合华为云数智融合平台的支撑,在供应链预测中围绕需求预测、物料匹配

华为 MetaERP 集成盘古大模型、天筹 AI 求解器等生成式 AI 相关技术能力,结合华为云数智融合平台的支撑,在供应链预测中围绕需求预测、物料匹配、风险预警等核心场景开展实践,大幅提升了供应链预测的精准度与效率,以下是具体实践内容及成效: 动态需求预测,降低库存偏差华为供应链涉及数万种采购物料,物料清单层级高,且市场需求波动大。MetaERP 集成华为云 ModelArts 等工具构建专属动态需求预测模型,融合深度学习算法,纳入市场趋势、历史销售、产能数据等多维度信息进行综合预测。在华为自身供应链应

金牌架构师 700

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LWN:GCC也支持BPF了!

关注了就能看到更多这么棒的文章哦~BPF in GCCBy Jake EdgeSeptember 15, 2020LPC原文来自:https://lwn.net/Articles/831...

Linux News搬运工 1198

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux kvm 分配内存失败,CentOS7.6中 KVM虚拟机内存、CPU调整

CentOS7.6中 KVM虚拟机内存、CPU调整一、调小虚拟机内存调小虚拟机内存可以动态实现,不用关机1.查看当前内存大小[[emailprotected] kvm]# virsh dominfo testId: 7名称: testUUID: 8f2bb4b7-c7ed-31aa-3676-9fb04923163dOS 类型: hv...

weixin_34434736的博客 796

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux服务之rsyslog

        日志片断分析 systemd:服务报出来的信息kvm:内核模块kvm报出来的信息kernel: tun: 内核的tun模块报出来的信息kernel: br0: 内核的br0模块报出来的信息kernel: kvm [1437] kvm进程为pid1437报出来的信息 Jul 31 11:00:01 localhost systemd: Starting Session...

weixin_34192816的博客 434

KVM guest虚拟机图形化安装

2 KVM Guest 安装方式virt-manager图形化安装1、 利用xmanager 中xshell 管理kvm host2、 Virt-manager 调出 图形化安装管理工具、新建虚拟机、根据规范输入唯一SN:vm000001、选择Fully virtualized准备工作:1.上传要安装的系统镜像到/data1[root@localhost ~]# ls ...

weixin_34200628的博客 290

KVM详解,太详细太深入了,经典

KVM 介绍(1):简介及安装 http://www.cnblogs.com/sammyliu/p/4543110.html 学习 KVM 的系列文章:  (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分配和 SR-IOV (5)libvir

sdulibh的专栏 5万+

「KVM」- 实现 Host 与 Guest 访问 @20210314

问题描述 在 KVM 中,我们经常为虚拟机选择桥接网络,以使虚拟机暴露在内网中,可以被其他主机访问。 但是,使用桥接网络的问题是:虚拟机(Guest)无法访问宿主机(Host),而我们希望两者能够互相访问。 该笔记将记录:在 KVM 中,如何实现宿主机与虚拟机的相互访问,以及常见问题的处理方法。 问题原因 在 KVM 中,Guest 在桥接模式下,无法访问 Host 主机,这并不是错误,而是 macvtap 设备的特性。物理设备绑定到 macvtap 网桥,进入网桥的流量被转发到了设备上,不通过.

k4nz 1499

kvm_guest主机克隆

1、kvm克隆需要将源主机处于暂停或关机状态,常用命令: virsh>list--all列出所有主机 virsh>startdomain1开启domain1虚机 virsh>shutdowndomain1关闭domain1虚机 virsh>destroydomain1断电domain1虚机 virsh>au...

weixin_34410662的博客 220

挂载KVM Guest操作系统磁盘

使用虚拟机时, 发现想要修改虚拟机中的文件非常麻烦, 需要启动虚拟机, 然后再登录进去修改. 对于已经关闭的虚拟机, 为了修改一个文件而启动, 非常耽误时间. 对于一个无法启动的虚拟机(比如启动文件损坏), 则束手无策.   因此, 掌握在主机中挂载 Guest 的操作系统磁盘, 并修改其中的内容的方法在某些时候会非常有用.   1. 挂载 Guest 操作系统磁盘的方法 挂载 Gu...

weixin_33769125的博客 213

kvm虚拟化之guest镜像文件的挂载

实际应用中的KVM主机也会遇到像物理机一样的情况,如系统崩溃、无法引导等情况。物理机会现该情况时,我们可以通过光盘引导、单用户模式、PE引导、修复或升级安装等方式获取系统内的文件和数据,KVM中也不但同样也可以使用上述方法,而且可以利用KVM 本身为我们提供的特性将分区挂载到物理机的分区上进行分析、查看、甚至数据提取。这里还是以raw、qcow2两种格式的挂载为例进行说明。 一、raw磁盘镜像的

乌托邦 7657

从命令行启动KVM guest

从命令行启动KVM guest 一直习惯了用libvirt在图形界面下安装OS,刚才尝试了一下用命令行 创建、安装、运行 ubuntu OS。过程如下: 查看机器配置是否支持硬件虚拟化,以及安装kvm内核模块就不再叙述了。下边说一下启动虚拟机,安装系统的过程。 1、创建磁盘镜像: kvm-img create test.img 4G 建议使用raw格式,raw格式的性能比qc...

White_Lee的专栏 672
上一篇: LWN: 20年后能否解决 negative dentry 问题!
下一篇: LWN:我希望看到的关于readahead的文档!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值