网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
图1 虚拟化典型应用场景
技术形态
Hypervisor 直译即 “超级监督者” ,也称为虚拟机监控程序(VMM)。如图 2 所示,Hypervisor处于 SoC 硬件平台之上,将实体资源(如 CPU、内存、存储空间、网络适配器、外设等 ) 转换为虚拟资源,按需分配给每个虚拟机,允许它们独立地访问已授权的虚拟资源。Hypervisor 实现了硬件资源的整合和隔离,使应用程序既能共享 CPU 等物理硬件,也能依托不同的内核环境和驱动运行,从而满足汽车领域多元化应用场景需求。
图2 虚拟化在系统中的位置
在汽车领域,Hypervisior 主要完成以下任务:
CPU 虚拟化:为虚拟机提供 VCPU 资源和运行环境;
内存虚拟化:负责为其自身和虚拟机分配和管理硬件内存资源;
中断虚拟化:发生中断和异常时,按需将中断和异常路由到虚拟机进行处理;
虚拟机设备模拟:根据需求创建虚拟机可以访问的虚拟硬件组件;
硬件支持 BSP:提供 Hypervisor 在 SoC 上运行的板级支持包,如串口驱动;
虚拟机资源配置:对虚拟机的 CPU,内存,IO 外设等资源进行配置和管理;
虚拟机通信:为虚拟机提供 IPC,共享内存等通信机制。
虚拟机调度:为虚拟机提供优先级和时间片等调度算法;
虚拟机生命周期管理:创建,启动和停止虚拟机;
虚拟机调测服务:提供控制台,日志等调试功能;
在汽车领域,Hypervisior 还面临如下挑战:
轻量高效。Hypervisor 在带来软件定义的灵活性的同时,也导致了软件栈层次增加,不可避免会有性能损耗。汽车领域的成本敏感特性,注定了降低 CPU、存储、网络、GPU 等外设性能损耗的需求贯穿整车项目始终,因此 Hypervisor 的轻量和高效十分重要;
安全可靠。相较于互联网领域看重的资源动态分配和闲置利用,汽车领域更看重 Hypervisor 的实时性、可靠性、安全性;
便捷适配。在汽车领域,芯片类型和操作系统丰富多样,嵌入式虚拟化的一大特点就是异构,Hypervisor 必须具备快速适配不同的底层硬件和上层操作系统的能力。
技术发展趋势
2.1 云边端虚拟化关键技术差异化
虚拟化技术最早可以追溯到 20 世纪 60 年代,IBM 开发了虚拟机监视器软件,将计算机硬件虚拟分割成一个或多个虚拟机,可支持多名用户对大型计算机的同时、交互的访问。随着 21 世纪通用服务器算力的提升,云计算蓬勃发展,作为底层支撑技术的云虚拟化也快速迭代演进。后来算力从云、边、端逐步下沉,也就伴随着出现了边缘虚拟化、端侧嵌入式虚拟化。它们的典型架构、关键技术需求如图 3 所示。
图3 云边端虚拟化典型架构及关键技术需求
(1) 云侧虚拟化
其特点是硬件平台基本同构,大量节点构成集群,架构设计以吞吐能力优先,要支持多业务并发,虚拟化要满足集群负载均衡、节能降耗的资源调度策略,在进行跨节点虚拟机调配过程中,要保证业务无中断迁移。虚拟机故障时,要能保证从检查点恢复,减少业务损失,虚拟机要能支持 CPU 算力、内存、存储空间、网络、GPU、外设等能力的弹性扩展,还要能超分配,以便提升数据中心的运营收益。
(2) 边侧虚拟化
是在某些特定业务的边缘节点上,采用通用 ICT 架构,支持多种业务的动态部署,典型如 SDN、NFV。其技术特点是:基于通用硬件平台、行业定制的管理部署平台,实现软硬解耦、软件定义,多功能节点按需部署、弹性组网,一般会采用 1+1 或者 N+1 冗余方式保证业务高可用,在 5G 电信网元中需要考虑 5G 业务端到端实时性,Hypervisor、虚拟机、通信协议栈都需要设计考虑。
(3) 端侧虚拟化
端侧典型特点是异构,其芯片架构、处理能力都差异较大。一般是单芯片方案,不存在着集群、主备间的虚拟机迁移,因此比较强调高安全、单节点高可靠,比如会有功能安全 ASIL 等级要求,同时对于实时性、确定性有更强的要求。另外,端侧资源更加有限、成本更敏感,因此要求 Hypervisor 轻量化、高性能。
2.2 虚拟化模型趋势
Hypervisor 可以划分为两大类,一类是 Type1 裸机型,Hypervisor 直接运行在硬件设备上的,也叫做 Bare-Metal Hardware Virtualization(裸机虚拟化环境);一类是 Type2 主机托管型,也叫做 Hosted Virtualization (主机虚拟化环境)。图 4 展示了两种 Hypervisor 的分层架构。
图4 Type1和Typer2型Hypervisor
Type2 型 Hypervisor 需要借助宿主操作系统来管理 CPU、内存、网络等资源,由于 Hypervisor 和硬件之间存在一个宿主操作系统,Hypervisor 及 VM 的所有操作都要经过宿主操作系统,所以就不可避免地会存在延迟、性能损耗,同时宿主操作系统的安全缺陷及稳定性问题都会影响到运行在之上的 VM(虚拟机),所以 , Type-2 型 Hypervisor 主要用于对性能和安全要求不高的场合,比如 : 个人 PC 系统。
Type1 型的 Hypervisor 不依赖主机操作系统,其自身具备操作系统的基础功能。设计上更简洁,直接运行于硬件之上,整体代码量和架构更为精简,对内存和存储资源要求更少,可满足自动驾驶车控系统功能安全等级要求,也具备进行形式化验证的条件。所以汽车操作系统更适合使用 Type 1 型 Hypervisor。
随着微内核操作系统技术的发展,很多基于微内核操作系统设计的 Hypervisor 依赖的 Host OS 已经非常精简,只包括基本的、不变的功能,如 : CPU 调度和内存管理,设备驱动和其他可变组件处于内核之外,这类 Hypervisor 应当归于 Type1、还是 Type2,业内存在分歧。总体来说,微内核 Hypervisor 更小、更稳定、扩展性更好,更适合用于嵌入式虚拟化场合。
2.3 Hypervisor 与虚拟机协作技术路线
(1) 全虚拟化
最初的虚拟化是通过软件模拟具有完整硬件系统功能的、运行在一个隔离环境中的计算机系统,即通过软件虚拟硬件设备提供给 GuestOS 使用,优点是 GuestOS 不感知外部真实硬件环境、不用改动。由于 Guest OS 中每次访问全虚拟化硬件都要陷入到 Hypervisor 中,直接导致该方式虚拟的硬件性能较差,一般只用来模拟如串口等比较简单的硬件。对硬件的模拟可以在 Hypervisor 中直接模拟,也可以将请求传递到其他 VM 中进行模拟,如在某一 VM 中通过 QEMU 进行模拟。
(2) 硬件辅助虚拟化
Intel 最早提出硬件辅助虚拟化技术,由硬件直接提供共享功能,支持多 GuestOS 的访问,减少软件虚拟技术带来的延时和性能损耗。Intel 提出了分别针对处理器 & 内存、IO、网络的 Intel VT-x、Intel VT-d 和 Intel VT-c 技术等。随着 ARM 算力提升,从移动端向边缘、甚至云算力中心发展,ARM 也在不断增强其硬件辅助虚拟化技术,比如 stage 2 页表转换、虚拟异常等。
(3) 半虚拟化
在硬件辅助虚拟化技术不完善、不强大的发展阶段,或者对于某些复杂外设的共享复用,为避免全虚拟化的性能问题,可以采用 GuestOS 与 Hypervisor 协作的半虚拟化技术。这种技术一般应用于 IO 设备虚拟化,采用前后端的方式来实现 IO 设备虚拟化,在 Guest OS 中实现前端驱动,在 Hypervisor 或 Host OS 中实现后端驱动,前后端一般按照 VirtIO 标准来实现,后端驱动作为硬件的实际访问方。Guest OS 中前端驱动通过 Virt Queue 等通信机制与后端驱动进行通信,前端驱动将 Guest OS 的请求传递给后端驱动,后端驱动将请求发送给硬件驱动,处理完后将结果再传回给前端驱动。半虚拟化相对全虚拟化实现的硬件性能较好,且可实现相对比较复杂的硬件,比如 : 块设备,网卡,显示设备等。具体如图 5 所示。
图5 半虚拟化Pass-through资源分配
Hypervisor 支持将硬件资源直接分配给其上虚拟机中 Guest OS 使用,无需通过 Hypervisor 进行地址和指令翻译。例如 : 串口资源、USB 资源等接口比较丰富的资源可以通过 Pass-through 直接分配给某虚拟机使用。设备控制器一般都是以 MMIO 方式来访问的,所以只需要将控制器地址区域映射到 VM 就可实现设备控制器的分配,同时还需要分配一个设备硬件中断对应的虚拟中断到该 VM,直接透传的方式就是 VM 独占访问该硬件,所以在性能上是最好的。
关键技术解读
3.1 CPU 虚拟化和节能降耗技术
车载高性能处理器一般采用多核 CPU 架构。在 SMP(Symmetric Multi-Processing 对称多处理)架构下,Hypervisor 调度器会根据 CPU 的亲和性配置让客户机操作系统在指定的 CPU 上运行,虚拟机的操作系统可按照自己的调度方式,比如:优先级方式在 CPU 上进行任务调度。为了最大化地利用系统资源,Hypervisor 也支持多个虚拟机对某个 CPU 的共享使用。在共享核上,Hypervisor 可通过优先级或时间分区方式对虚拟机进行调度,确保虚拟机运行时间和调度策略是确定的。Hypervisor 的调度算法需要确保不能够出现分区内某个虚拟机出现死循环或故障而长期占用处理器资源,导致其他虚拟机的业务无法得到合理时间配额的问题。
虚拟机调度还需要考虑节能降耗问题,在工作负载较高的情况下系统提升主频提升用户体验,在工作负载较低的情况下系统自动节能降频提升续航。车载高性能处理器本身为了节能降耗需求设计为大小核架构,CPU 以及之上运行的复杂操作系统需要支持大小核调度,动态调频,低功耗设置,关闭 CPU 核,休眠(Suspend to RAM/Suspend to Disk)等节能降耗功能。系统虚拟化后,CPU 等物理资源都需要Hypervisor 才能直接访问,Hypervisor 调度算法也需要完成对虚拟机节能降耗的支持。
3.2 IO 设备虚拟化
出于性能考虑,一般嵌入式领域多使用半虚拟化技术。半虚拟化技术需要 Guest OS 中的前端驱动与Hypervisor 中的后端驱动配合实现。前端驱动将 Guest OS 的请求通过 Hypervisor 提供的通信机制发送给后端驱动,后端驱动通过调用物理驱动实现对设备的访问。这就涉及到不同厂商的 Guest OS 与不同厂商的 Hypervisor 生态对接问题。
Virtio 是目前最流行的一种 I/O 半虚拟化解决方案。Virtio 是 OASIS 标准组管理的开放协议和接口,以使得虚拟机能够标准化方式访问 IO 设备。Virtio 于 2016 年 3 月正式标准化,2020 发布 V1.1 版本。Virtio 标准采用通用和标准化的抽象模型,支持设备类型不断增加,性能高效,在云计算领域广泛应用,开源活跃度高,Linux 等操作系统已有稳定的前端驱动代码。大部分商业和开源 Hypervisor 都已经支持Virtio 标准。
Virtio 是车载行业比较常用的半虚拟化技术的实现,如图 6 所示,在 Guest OS 内部虚拟一条设备总线 Virtio-bus,通过 Virtio Ring 双向通信机制,前端驱动与挂载在 Virtio-bus 上遵循 Virtio 标准的后端虚拟设备,进行访问与通信。Virtio 提供了全面的 Virtio 总线和设备控制接口,包括 virtio-net, virtio-blk, virtio-console, virtio-input 等。
图6 Virtio虚拟化实现模型
利用 virtio-blk 技术实现块设备共享
块设备是使用缓存机制读写的存储设备,分配给 Hypervisor 所在的操作系统进行管理。virtio-blk driver 是符合 virtio 标准的块设备驱动,vdev virtio block 是后端的虚拟块设备,virtio blk driver 通过该vdev 设备完成对物理块设备的读写,并获取执行结果。
利用 virtio-net 技术实现跨系统通信
Virtio-net 实现了多系统间点对点的通信,Guest 系统内部的 virtio-net driver 通过 virtqueue 与Hypervisor 所在系统的 virtio-net 设备进行全双工通信,实现多系统之间的控制类、配置类的指令、数据的交互。适合音视频流以外的数据传输,稳定性较好,因 virtqueue 的控制逻辑复杂,对实时性有一定影响。
利用 virtio 技术实现触摸共享
触摸设备是字符型设备,通过 virtio-input driver、vdev-input 实现前端驱动和后端设备。设备端通过 virtqueue 向驱动上报触摸坐标数据。
3.3 实时性技术
实时性是嵌入式实时操作系统的关键性能指标。Hypervisor 的实时性是整个系统实时性的基础,如果 Hypervisor 无法及时调度到客户机操作系统运行,客户机操作系统也不能取得较好的实时性指标。衡量 Hypervisor 实时性主要指标包括中断延迟和调度延迟。中断延迟以硬件发生中断时刻为起始时间,以虚拟机收到 Hypervisor 注入的中断时刻为截止时间,在各种压力情况下最长延时时间即为中断延时。调度延迟是指以高优先级的虚拟机进程就绪为起始时刻,以该高优先的虚拟机进程得到调度运行为截止时刻,在系统各种压力情况下最长的延时时间即为调度延迟。
中断虚拟化后,当外界中断产生时,Hypervisor 收到并以最快的速度注入到虚拟机,使得 Hypervisor 对虚拟机中断处理时间足够少。Hypervisor 优化虚拟机的切换时间,尽量减少 Hypervisor 上关中断和关抢占的时间,尽量少使用内核锁,当高优先级的虚拟机需要切换运行时,能最快速度切换至高优先级虚拟机上运行。
3.4 安全和可靠性技术
功能安全、信息安全和可靠性是车控操作系统产品可靠安全运行的必要组成部分。Hypervisor 为智能汽车域控制器提供基础运行环境,其安全性和可靠性是保证整个系统功能安全和可靠的基础和核心。Hypervisor 需按照汽车功能安全 ISO26262 ASIL-D 最高标准进行设计,开发和测试,其功能安全需求由域控制器产品的安全需求分解产生。
Hypervisor 上运行了多个虚拟机,一个虚拟机的异常不能传递至其他虚拟机。Hypervisor 能获取到当前系统整体健康状态,当虚拟机发生异常时,Hypervisor 应实时监控系统健康状态,有效地隔离故障,并在最小波及范围内修复异常,保障系统持续可用。
Hypervisor 加入汽车软件栈,会导致纵向上软件栈层次增加,横向上业务软件复杂度增加,而汽车的安全可靠要求强于既有的云侧虚拟化、边缘虚拟化,因此虚拟化安全性正日益得到行业的关注。这些安全性包括:
虚拟机管理器和虚拟机之间的信任链问题。利用虚拟化技术在一个可信物理平台上创建出多个虚拟机,并将从硬件可信根开始构建的信任链传递到每一个虚拟机,从而在一个可信物理平台上构建多个虚拟的可信计算平台,有些解决方案缺乏虚拟机管理器到虚拟机之间的信任链验证;
虚拟机间的攻击:恶意入侵者可以通过利用虚拟机管理程序中的漏洞,通过同一物理主机上存在的另一个虚拟机来获得对虚拟机的控制,从而破坏目标虚拟机;
虚拟机逃逸:利用虚拟机软件或者虚拟机中运行的软件的漏洞进行攻击,以达到攻击或控制虚拟机宿主操作系统的目的。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
…(img-qxhgfaf0-1715552379561)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新