0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

StratoVirt中vCPU管理模块的组成及位置

openEuler 来源:openEuler 作者:openEuler 2021-12-20 15:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

StratoVirt是开源在openEuler社区的轻量级虚拟化平台,具备轻量低噪、强安全性的行业竞争力。 StratoVirt进程运行在用户态,在虚拟机启动之前,StratoVirt会完成启动之前的准备工作,包括虚拟机内存的初始化、CPU寄存器初始化、设备初始化等,启动,CPU寄存器初始化和虚拟机在运行过程中vCPU陷出事件的处理,都是由StratoVirt的vCPU管理模块CPU完成。如下是StratoVirt中vCPU管理模块的组成,以及其在StratoVirt中的位置。

stratovirt
├──acpi
├──address_space
├──boot_loader
├──Cargo.lock
├──Cargo.toml
├──cpu
│├──Cargo.toml
│└──src
│├──aarch64
││├──caps.rs
││├──core_regs.rs
││└──mod.rs
│├──lib.rs
│└──x86_64
│├──caps.rs
│├──cpuid.rs
│└──mod.rs
├──devices
├──hypervisor
├──machine
├──machine_manager
├──migration
├──migration_derive
├──ozone
├──pci
├──src
│└──main.rs
├──sysbus
├──util
├──vfio
└──virtio

StratoVirt vCPU模块的整体设计

StratoVirt的虚拟化解决方案也是一套软硬结合的硬件辅助虚拟化解决方案,它的运作依赖于硬件辅助虚拟化的能力(如VT-X或Kunpeng-V)。vCPU模块的实现也是紧密依赖于这一套硬件辅助虚拟化的解决方案的。 对于物理机的CPU而言,硬件辅助虚拟化为CPU增加了一种新的模式:Non-Root模式,在该模式下,CPU执行的并不是物理机的指令,而是虚拟机的指令。这种指令执行方式消除了大部分性能开销,非常高效。但是特权指令(如I/O指令)不能通过这种方式执行,还是会强制将CPU退出到普通模式(即ROOT模式)下交给内核KVM模块和用户态StratoVirt去处理,处理完再重新回到Non-Root模式下执行下一条指令。 而StratoVirt中的vCPU模块主要围绕着KVM模块中对vCPU的模拟来实现,为了支持KVM模块中对CPU的模拟,CPU子系统主要负责处理退出到普通模式的事件,以及根据在GuestOS内核开始运行前对vCPU寄存器等虚拟硬件状态的初始化。整个vCPU模块的设计模型如下图所示:

StratoVirt通过第三方库kvm_ioctls来完成和KVM模块的交互,通过匹配vcpu_fd.run()函数的返回值来处理退出到ROOT模式的事件,该函数的返回值是一个名为VcpuExit的枚举,定义了退出到ROOT模式的事件类型,包括I/O的下发、系统关机事件、系统异常事件等,根据事件的类型vCPU将对不同的事件作出各自的处理。以上的整个过程都被包含在一个独立的vCPU线程中,用户可以自己通过对vCPU线程进行绑核等方式让虚拟机的vCPU获取物理机CPU近似百分之百的性能。 同时,对vCPU寄存器虚拟硬件状态信息的初始化则是和StratoVirt的另一个模块BootLoader相互结合,在BootLoader中实现了一种根据Linux启动协议快速引导启动Linux内核镜像的方法,在这套启动流程中,BootLoader将主动完成传统BIOS对一些硬件信息的获取,将对应的硬件表保存在虚拟机内存中,同时将提供一定的寄存器设置信息,这些寄存器设置信息将传输给vCPU模块,通过设置vCPU结构中的寄存器值,让虚拟机CPU跳过实模式直接进入保护模式运行,这样Linux内核就能直接从保护模式的入口开始运行,这种方式让StratoVirt的启动流程变得轻量快速。 在整个vCPU模块中,因为涉及到内核的KVM模块,少不了与C语言代码做交互。作为系统编程语言,Rust对FFI有非常完善的支持,让vCPU中和KVM模块交互的部分高效且安全。

vCPU线程模型同步

vCPU模块还有一大职责就是管理vCPU的生命周期,包括new(创建),realize(使能),run(运行),pause(暂停),resume(恢复),destroy(销毁)。New和realize的过程就是结构体创建和寄存器初始化的流程,run的过程即是实现KVM中vCPU运作和VCPU_EXIT退出事件处理的流程。 另外的三种生命周期的实现则涉及到对线程同步的精密控制,例如在虚拟机destroy的过程中,一般只有某一个vCPU接收到VCPU_EXIT中的SHUTDOWN事件,该vCPU线程需要把该事件传递到所有的vCPU线程,同步所有vCPU线程的状态,完成虚拟机的优雅关机。在这种场景下,我们就需要考虑在Rust中如何实现在多线程中进行状态同步。

Rust中通过条件变量来实现同步

Rust多线程编程中,有一类用于同步的机制叫做屏障(Barrier),用于让多线程来同步一些流程开始的位置,它相当于一个闸口,使用wait方法,将该线程放进临界区并阻塞住,只有每个Barrier都到达wait方法调用的点,闸口才会打开,所有的线程同步往下运行。 而在比较复杂的同步场景中,Rust还提供了另一个同步机制条件变量(Condition Variable)来支持更复杂的同步场景,它和屏障的功能类似,但是它并不阻塞全部进程,而是在满足指定的条件之前阻塞某个得到互斥锁的进程。也就是说,通过条件变量,我们可以在达到某种条件之前阻塞某个线程,这个特性可以让我们很好得对线程进行同步。 为了支持各种场景的同步控制,条件变量还提供了三个方法:

notify_one(): 用来通知一次阻塞线程,如果有复数个线程被阻塞住,notify_one会被一个阻塞的线程所消耗,不会传递到别的阻塞线程去。

notify_all(): 用来通知所有的阻塞线程。

wait_timeout(): 将当前线程置入临界区阻塞住并等待通知,可以设定一个timeout来设置阻塞的最大时间,以免造成永久的阻塞导致程序卡死。

需要注意的一点是条件变量需要和锁一起使用,而在程序运行中,每个条件变量每次只能和一个互斥体(被Mutex等锁包裹都可称为互斥体)进行使用。

vCPU生命周期控制和线程同步

在CPU数据结构初始化时,创建一个互斥的生命周期枚举(CpuLifecycleState)和一个条件变量。

pubfnnew(
vcpu_fd:Arc,
id:u8,
arch_cpu:Arc>,
vm:Arc>,
)->Self{
CPU{
id,
fd:vcpu_fd,
arch_cpu,
state:Arc::Created),Condvar::new())),
work_queue:Arc::new(0),Condvar::new())),
task:Arc::new(None)),
tid:Arc::new(None)),
vm:Arc::downgrade(&vm),
}
}
以destory生命周期为例,在x86_64架构下,当某个vCPU线程接收到VcpuExit::Shutdown事件后,会将该线程的CpuLifecycleState修改为Stopped,并调用保存在CPU数据结构中一个指向上层结构的虚拟机destroy方法,该方法能遍历一个保存着所有CPU数据结构的数组,执行数组中每一个CPU的destory()方法,该函数的实现如下:
fndestory(&self)->Result<()>{
let(cpu_state,cvar)=&*self.state;
if*cpu_state.lock().unwrap()==CpuLifecycleState::Running{
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopping;
}else{
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopped;
}

/*省略具体的关机逻辑*/

letmutcpu_state=cpu_state.lock().unwrap();
cpu_state=cvar
.wait_timeout(cpu_state,Duration::from_millis(32))
.unwrap()
.0;

if*cpu_state==CpuLifecycleState::Stopped{
*cpu_state=CpuLifecycleState::Nothing;
Ok(())
}else{
Err(ErrorKind::DestroyVcpu(format!("VCPUstillin{:?}state",*cpu_state)).into())
}
}
作为CPU的成员方法,destory函数能获取到每个CPU数据结构的互斥状态和条件变量,此时将除触发vCPU外所有的CPU数据的互斥状态解锁,并将状态从运行时的Running修改为vCPU关机时的Stopping。这里要注意一点,此时所有CPU的destroy函数都是在触发关机事件的vCPU进程中进行的,而不是在每个vCPU各自的进程中进行。 紧接着进入Stopping状态后,destroy函数会执行每个vCPU各自的关机逻辑,包括触发vCPU,这部分主要还是与KVM模块进行交互,进行一些退出状态的变更等。在执行完vCPU的关机逻辑后,条件变量会进入到wait_timeout的等待状态,它的参数为每个vCPU的CpuLifecycleState生命周期状态枚举和等待超时时间,也就是说在该生命周期枚举状态变化前,该线程都会进入阻塞状态。 此时除触发vCPU外的vCPU线程中,CpuLifecycleState都已经进入了Stopping状态,在所有vCPU线程中,vCPU的指令模拟函数kvm_vcpu_exec()都运行在一个循环中,对于每次循环的入口,都会执行ready_for_running()函数进入是否继续模拟的判断,在该函数中会对每个vCPU对应的CpuLifecycleState进行监控,当发现CpuLifecycleState已经变成Stopping时,vCPU将会退出循环,不继续进行vCPU的模拟,退出模拟的循环后,将会修改CpuLifecycleState为Stopped:
//Thevcputhreadisabouttoexit,markingthestateoftheCPUstateasStopped.
let(cpu_state,_)=&*self.thread_cpu.state;
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopped;
修改vCPU线程中互斥的生命周期状态枚举后,将会触发阻塞线程中对应的wait_timeout()函数,同时,该vCPU线程的生命周期结束。而对于阻塞线程,当其余vCPU线程的状态都已经变成Stopped后,阻塞解除,此时,所有的vCPU线程都已经状态都已经同步到了Stopped,线程状态同步成功。 用类似思路也可以实现pause(暂停)和resume(恢复)的生命周期控制。

原文标题:StratoVirt vCPU管理Rust线程同步的实现

文章出处:【微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5590

    浏览量

    129091
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11218

    浏览量

    222977
  • 虚拟机
    +关注

    关注

    1

    文章

    968

    浏览量

    30179

原文标题:StratoVirt vCPU管理Rust线程同步的实现

文章出处:【微信号:openEulercommunity,微信公众号:openEuler】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    `lv_obj_tree.h` 在 **LVGL v9** 位置和作用

    )已经封装了这些逻辑,无需直接包含 lv_obj_tree.h。 总结 lv_obj_tree.h 是 LVGL 内部管理对象树结构的核心头文件,位于 src/core/ 目录,主要供 LVGL 自身模块调用,上层应用开发较少
    发表于 11-13 15:49

    魏德米勒麒麟QL20系列I/O模块在粮仓管理系统的应用

    为全面应对上述痛点,项目选用了魏德米勒麒麟QL20系列I/O模块作为整个粮仓管理系统的核心控制单元。
    的头像 发表于 10-29 15:31 448次阅读

    智慧工地管理系统正在公路建设逐渐被广泛应用

    、费用管理、合同管理和资料管理等方面,为工地管理者提供了全方位的支持和帮助。        1、质量管理        智慧工地
    的头像 发表于 08-28 08:48 434次阅读
    智慧工地<b class='flag-5'>管理</b>系统正在公路建设<b class='flag-5'>中</b>逐渐被广泛应用

    RFID标签在服装供应链管理的应用

    二、RFID标签在服装供应链管理的优势高效率:RFID可以快速批量读取服装信息,大幅缩短操作时间,提高供应链管理效率。准确性:RFID减少了人工操作的错误率,提高了服装供应链管理的准
    的头像 发表于 07-14 17:02 494次阅读
    RFID标签在服装供应链<b class='flag-5'>管理</b><b class='flag-5'>中</b>的应用

    NVME控制器之队列管理模块

    如图1所示。 图1 队列管理模块框图 在NVMe协议,使用队列来传输、缓存和处理命令条目,以实现Host端和NVMe SSD端之间的通信。在CPU上运行NVMe软件协议栈,其Host端生成提交命令
    发表于 05-03 20:19

    NVME控制器之队列管理模块

    队列管理模块是整个NVMe Host控制器的核心模块,该模块实现了提交队列与完成队列的管理,多队列请求的仲裁判决等功能。队列
    的头像 发表于 05-03 15:32 423次阅读
    NVME控制器之队列<b class='flag-5'>管理</b><b class='flag-5'>模块</b>

    智能仓储管理解决方案NRF5832

    应对企业仓库和车间物资管理的各种挑战。 这套解决方案具备许多优点,主要集中在物品出入库时间和位置信息的准确管理方面。通过蓝牙信标发出的信号,定位器能够精准接收并控制标签发射信号的功率
    发表于 04-10 14:10

    可以在MCUXpressoIDE哪些位置管理工具链?

    \'} arm-gnu-toolchain-12.3.rel1-mingw-w64-i686-arm-none-eabiarm-none-eabiinclude/sys/types.h:107:25: error: conflicting types for \'clock_t\'; have \'long unsigned int\' 我应该使用
    发表于 04-10 07:37

    RFID标签在仓储管理的应用

    RFID标签在仓储管理中发挥着重要作用,其高效、精准和自动化的特性显著提升了仓储管理的效率和准确性。以下是RFID标签在仓储管理的主要应用及其优势:1.货物追踪与库存
    的头像 发表于 03-21 13:58 936次阅读
    RFID标签在仓储<b class='flag-5'>管理</b><b class='flag-5'>中</b>的应用

    RFID标签在资产管理的应用管理

    ,这些信息是准确识别资产的基础。购置时间、购置价格等财务信息也被完整记录,方便企业进行成本核算和资产价值评估。存放位置信息则能让管理人员随时了解资产的实际所在,便于快
    的头像 发表于 03-12 17:50 597次阅读
    RFID标签在资产<b class='flag-5'>管理</b><b class='flag-5'>中</b>的应用<b class='flag-5'>管理</b>

    谈谈什么是曲轴位置传感器

    在现代汽车的心脏——发动机内部,一个看似不起眼却至关重要的部件正默默工作着,它就是曲轴位置传感器。作为发动机管理系统的关键一环,曲轴位置传感器不仅监测着发动机的运行状态,还直接参与着
    的头像 发表于 02-14 14:32 1188次阅读

    RFID技术在环境检测实验室样品管理的应用

    RFID技术在环境检测实验室样品管理的应用,不仅提高了管理的准确性和效率,还减少了手工操作可能带来的差错。通过RFID技术与样品管理系统的结合,实验室可准确获取样品存储
    的头像 发表于 02-10 09:17 578次阅读

    硬件处理模块的概念、特点和在系统位置

    本文介绍了硬件处理模块的概念、特点和在系统位置。 一、硬件处理模块的基本概念 专注于特定功能  硬件处理模块可以理解为在芯片内部专门“定
    的头像 发表于 01-20 13:52 1275次阅读
    硬件处理<b class='flag-5'>模块</b>的概念、特点和在系统<b class='flag-5'>中</b>的<b class='flag-5'>位置</b>

    电脑相片云存储位置,如何快速找到电脑相片云存储位置

    在数字化时代,传统的电脑已经无法满足我们对高效、便捷计算的需求。云电脑以其强大的功能和灵活的使用方式,成为了新时代的宠儿。今天就为大家介绍如何快速找到电脑相片云存储位置。    在现代办公和生活
    的头像 发表于 01-16 10:44 4223次阅读
    电脑相片云存储<b class='flag-5'>位置</b>,如何快速找到电脑相片云存储<b class='flag-5'>位置</b>

    解锁高效项目管理,Zentao 在华为云 Flexusx 容器化部署与应用指南

    前言 在当今快速迭代的商业环境,高效且灵活的项目管理成为企业竞争力的关键。华为云 Flexusx 实例,以其灵活的 vCPU 内存配比、热变配功能及按需计费模式 ,为项目管理软件如
    的头像 发表于 01-13 15:54 1046次阅读
    解锁高效项目<b class='flag-5'>管理</b>,Zentao 在华为云 Flexusx 容器化部署与应用指南