全网独一无二值得收藏《Linux内核虚拟技术大全》

全网独一无二值得收藏《Linux内核虚拟技术大全》Linux 提供了对不同管理程序虚拟化技术的支持 pv ops 提供了一组函数指针 代表了与低级关键指令和各领域高级功能相对应的操作

大家好,欢迎来到IT知识分享网。

一、半虚拟化操作

二、客户机停机轮询机制(Guest halt polling)

三、Nitro Enclaves

四、ACRN超级管理器

一、半虚拟化操作

Linux提供了对不同管理程序虚拟化技术的支持。历史上,为了支持不同的虚拟机超级管理器 (hypervisor,下文简称超级管理器),需要不同的二进制内核,这个限制已经被pv_ops移 除了。Linux pv_ops是一个虚拟化API,它能够支持不同的管理程序。它允许每个管理程序 优先于关键操作,并允许单一的内核二进制文件在所有支持的执行环境中运行,包括本机——没 有任何管理程序。

pv_ops提供了一组函数指针,代表了与低级关键指令和各领域高级功能相对应的操作。 pv-ops允许在运行时进行优化,在启动时对低级关键操作进行二进制修补。

pv_ops操作被分为三类:

简单的间接调用

这些操作对应于高水平的函数,众所周知,间接调用的开销并不十分重要。

间接调用,允许用二进制补丁进行优化

通常情况下,这些操作对应于低级别的关键指令。它们被频繁地调用,并且是对性能关 键。开销是非常重要的。

一套用于手写汇编代码的宏程序

手写的汇编代码(.S文件)也需要半虚拟化,因为它们包括敏感指令或其中的一些代 码路径对性能非常关键。

二、客户机停机轮询机制(Guest halt polling)

cpuidle_haltpoll驱动,与haltpoll管理器一起,允许客户机vcpus在停机前轮询 一定的时间。

这为物理机侧的轮询提供了以下好处:

  1. 在执行轮询时,POLL标志被设置,这允许远程vCPU在执行唤醒时避免发送 IPI(以及处理IPI的相关成本)。
  2. 可以避免虚拟机退出的成本。

客户机侧轮询的缺点是,即使在物理机中的其他可运行任务中也会进行轮询。

其基本逻辑如下。一个全局值,即guest_halt_poll_ns,是由用户配置的,表示允 许轮询的最大时间量。这个值是固定的。

每个vcpu都有一个可调整的guest_halt_poll_ns(”per-cpu guest_halt_poll_ns”), 它由算法响应事件进行调整(解释如下)。

模块参数 haltpoll管理器有5个可调整的模块参数:

  1. guest_halt_poll_ns:

轮询停机前执行的最大时间,以纳秒为单位。 默认值:

  1. guest_halt_poll_shrink:

当唤醒事件发生在全局的guest_halt_poll_ns之后,用于缩减每个CPU的guest_halt_poll_ns 的划分系数。 默认值: 2

  1. guest_halt_poll_grow:

当事件发生在per-cpu guest_halt_poll_ns之后但在global guest_halt_poll_ns之前, 用于增长per-cpu guest_halt_poll_ns的乘法系数。 默认值: 2

  1. guest_halt_poll_grow_start:

在系统空闲的情况下,每个cpu guest_halt_poll_ns最终达到零。这个值设置了增长时的 初始每cpu guest_halt_poll_ns。这个值可以从10000开始增加,以避免在最初的增长阶 段出现失误。: 10k, 20k, 40k, … (例如,假设guest_halt_poll_grow=2). 默认值: 50000

  1. guest_halt_poll_allow_shrink:

允许缩减的Bool参数。设置为N以避免它(一旦达到全局的guest_halt_poll_ns值,每CPU的 guest_halt_poll_ns将保持高位)。 默认值: Y 模块参数可以从Debugfs文件中设置,在:
/sys/module/haltpoll/parameters/

  • 在设置guest_halt_poll_ns参数时应该小心,因为一个大的值有可能使几乎是完全空闲机 器上的cpu使用率达到100%。

三、Nitro Enclaves

Nitro Enclaves(NE)是亚马逊弹性计算云(EC2)的一项新功能,允许客户在EC2实 例中划分出孤立的计算环境[1]。 例如,一个处理敏感数据并在虚拟机中运行的应用程序,可以与在同一虚拟机中运行的 其他应用程序分开。然后,这个应用程序在一个独立于主虚拟机的虚拟机中运行,即 enclave。 一个enclave与催生它的虚拟机一起运行。这种设置符合低延迟应用的需要。为enclave 分配的资源,如内存和CPU,是从主虚拟机中分割出来的。每个enclave都被映射到一 个运行在主虚拟机中的进程,该进程通过一个ioctl接口与NE驱动进行通信。 在这个意义上,有两个组成部分。 1. 一个enclave抽象进程——一个运行在主虚拟机客体中的用户空间进程,它使用NE驱动 提供的ioctl接口来生成一个enclave虚拟机(这就是下面的2)。 有一个NE模拟的PCI设备暴露给主虚拟机。这个新的PCI设备的驱动被包含在NE驱动中。 ioctl逻辑被映射到PCI设备命令,例如,NE_START_ENCLAVE ioctl映射到一个enclave 启动PCI命令。然后,PCI设备命令被翻译成在管理程序方面采取的行动;也就是在运 行主虚拟机的主机上运行的Nitro管理程序。Nitro管理程序是基于KVM核心技术的。 2. enclave本身——一个运行在与催生它的主虚拟机相同的主机上的虚拟机。内存和CPU 从主虚拟机中分割出来,专门用于enclave虚拟机。enclave没有连接持久性存储。 从主虚拟机中分割出来并给enclave的内存区域需要对齐2 MiB/1 GiB物理连续的内存 区域(或这个大小的倍数,如8 MiB)。该内存可以通过使用hugetlbfs从用户空间分 配[2][3]。一个enclave的内存大小需要至少64 MiB。enclave内存和CPU需要来自同 一个NUMA节点。 一个enclave在专用的核心上运行。CPU 0及其同级别的CPU需要保持对主虚拟机的可用 性。CPU池必须由具有管理能力的用户为NE目的进行设置。关于CPU池的格式,请看内核 文档[4]中的cpu list部分。 enclave通过本地通信通道与主虚拟机进行通信,使用virtio-vsock[5]。主虚拟机有 virtio-pci vsock模拟设备,而飞地虚拟机有virtio-mmio vsock模拟设备。vsock 设备使用eventfd作为信令。enclave虚拟机看到通常的接口——本地APIC和IOAPIC——从 virtio-vsock设备获得中断。virtio-mmio设备被放置在典型的4 GiB以下的内存中。 在enclave中运行的应用程序需要和将在enclave虚拟机中运行的操作系统(如内核、 ramdisk、init)一起被打包到enclave镜像中。enclave虚拟机有自己的内核并遵循标 准的Linux启动协议[6]。 内核bzImage、内核命令行、ramdisk(s)是enclave镜像格式(EIF)的一部分;另外 还有一个EIF头,包括元数据,如magic number、eif版本、镜像大小和CRC。 哈希值是为整个enclave镜像(EIF)、内核和ramdisk(s)计算的。例如,这被用来检 查在enclave虚拟机中加载的enclave镜像是否是打算运行的那个。 这些加密测量包括在由Nitro超级管理器成的签名证明文件中,并进一步用来证明enclave 的身份;KMS是NE集成的服务的一个例子,它检查证明文件。 enclave镜像(EIF)被加载到enclave内存中,偏移量为8 MiB。enclave中的初始进程 连接到主虚拟机的vsock CID和一个预定义的端口–9000,以发送一个心跳值–0xb7。这 个机制用于在主虚拟机中检查enclave是否已经启动。主虚拟机的CID是3。 如果enclave虚拟机崩溃或优雅地退出,NE驱动会收到一个中断事件。这个事件会通过轮询 通知机制进一步发送到运行在主虚拟机中的用户空间enclave进程。然后,用户空间enclave 进程就可以退出了。

四、ACRN超级管理器

1、ACRN超级管理器介绍

ACRN超级管理器是一个第一类超级管理器,直接在裸机硬件上运行。它有一个特权管理虚拟机,称为服 务虚拟机,用于管理用户虚拟机和进行I/O仿真。

ACRN用户空间是一个运行在服务虚拟机中的应用程序,它根据命令行配置为用户虚拟机仿真设备。 ACRN管理程序服务模块(HSM)是服务虚拟机中的一个内核模块,为ACRN用户空间提供管理程序服 务。

下图展示了该架构。

全网独一无二值得收藏《Linux内核虚拟技术大全》

ACRN用户空间为用户虚拟机分配内存,配置和初始化用户虚拟机使用的设备,加载虚拟引导程序, 初始化虚拟CPU状态,处理来自用户虚拟机的I/O请求访问。它使用ioctls来与HSM通信。HSM通过 与ACRN超级管理器的hypercalls进行交互来实现管理服务。HSM向用户空间输出一个char设备接口 (/dev/acrn_hsm)。

2、I/O请求处理

客户虚拟机的I/O请求由超级管理器构建,由ACRN超级管理器服务模块分发到与I/O请求的地址范 围相对应的I/O客户端。I/O请求处理的细节将在以下章节描述。

1. I/O请求 对于每个客户虚拟机,有一个共享的4KB字节的内存区域,用于超级管理器和服务虚拟机之间的 I/O请求通信。一个I/O请求是一个256字节的结构体缓冲区,它是 “acrn_io_request” 结构 体,当客户虚拟机中发生被困的I/O访问时,由超级管理器的I/O处理器填充。服务虚拟机中的 ACRN用户空间首先分配一个4KB字节的页面,并将缓冲区的GPA(客户物理地址)传递给管理平 台。缓冲区被用作16个I/O请求槽的数组,每个I/O请求槽为256字节。这个数组是按vCPU ID 索引的。

2. I/O客户端 一个I/O客户端负责处理客户虚拟机的I/O请求,其访问的GPA在一定范围内。每个客户虚拟机 可以关联多个I/O客户端。每个客户虚拟机都有一个特殊的客户端,称为默认客户端,负责处理 所有不在其他客户端范围内的I/O请求。ACRN用户空间充当每个客户虚拟机的默认客户端。 下面的图示显示了I/O请求共享缓冲区、I/O请求和I/O客户端之间的关系。

全网独一无二值得收藏《Linux内核虚拟技术大全》

3. I/O请求状态转换

一个ACRN I/O请求的状态转换如下。

全网独一无二值得收藏《Linux内核虚拟技术大全》

  • FREE: 这个I/O请求槽是空的
  • PENDING: 在这个槽位上有一个有效的I/O请求正在等待
  • PROCESSING: 正在处理I/O请求
  • COMPLETE: 该I/O请求已被处理

处于COMPLETE或FREE状态的I/O请求是由超级管理器拥有的。HSM和ACRN用户空间负责处理其 他的。

4. I/O请求的处理流程

  1. 当客户虚拟机中发生被陷入的I/O访问时,超级管理器的I/O处理程序将把I/O请求填充为 PENDING状态。
  2. 超级管理器向服务虚拟机发出一个向上调用,这是一个通知中断。
  3. upcall处理程序会安排一个工作者来调度I/O请求。
  4. 工作者寻找PENDING I/O请求,根据I/O访问的地址将其分配给不同的注册客户,将其 状态更新为PROCESSING,并通知相应的客户进行处理。
  5. 被通知的客户端处理指定的I/O请求。
  6. HSM将I/O请求状态更新为COMPLETE,并通过hypercalls通知超级管理器完成。

在ACRN超级管理器上运行的客户虚拟机可以使用CPUID检查其一些功能。

ACRN的cpuid函数是:

函数: 0x

返回:

全网独一无二值得收藏《Linux内核虚拟技术大全》

注意,ebx,ecx和edx中的这个值对应于字符串“ACRNACRNACRN”。eax中的值对应于这个叶子 中存在的最大cpuid函数,如果将来有更多的函数加入,将被更新。

函数: define ACRN_CPUID_FEATURES (0x)

返回:

全网独一无二值得收藏《Linux内核虚拟技术大全》

其中flag的定义如下:

全网独一无二值得收藏《Linux内核虚拟技术大全》

函数: 0x

返回:

全网独一无二值得收藏《Linux内核虚拟技术大全》

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/175625.html

(0)
上一篇 2025-04-07 10:15
下一篇 2025-01-17 20:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信