[V-00] 虚拟化概论-思想

前言

一直在做Android、Linux、虚拟化方面的工作,其中对于虚拟化技术的研究也略微摸了摸门槛。这里和大家记录分享,希望和读者通过一系列的文章进一步交流。圣贤曰: 三人行,必有我师。希望大家多批评指正,这里面也要感谢虚拟化技术的前辈,本人也是阅读了大量牛人技术文档和代码,才敢落笔。

本文的受众,主要是对虚拟化技术感兴趣的同学。如果写过几年嵌入式的代码,对程序不陌生,有一些操作系统方面的基础并且对Arm或者x86的体系又有一定的研究那理解起来应该会更加容易,老规矩虚拟化的专家请保护自己的眼睛。

虚拟化这个主题,大概会分为如下几个方面展开:
(1) 虚拟化概论: 包括虚拟化的思想、技术分类、以及Hypervisor的基础概念。
(2) 嵌入式基础: ARMv8、Linux、Android的一些基础知识。
(3) Hypervisor: CPU虚拟化、内存虚拟化、中断虚拟化。
(4) 设备虚拟化: 全虚拟化、半虚拟化、Passthrough模式。
(5) 虚拟化案例: Display,Audio,Video等子系统的设计 案例。
(6) 虚拟化性能: 工程实践中的一般架构设计思想和优化思路。

本文先介绍虚拟化概论- 虚拟化思想

正文

1 虚拟化思想

电子信息工程专业的同学对于模拟电子和数字电子的学科应该不陌生,大学的时候天天学习和研究的微电子技术就是计算机科学的基础。对于一个简单的电路,比如一个放大器或者与或门,我们尚且能够用二极管,三极管的知识cover住,但是对于大规模的集成电路,如果一般的工程师要拘泥于这些具体的知识点那么工程实践的成本就变得极大。聪明的大神们采用了封装的思想用一个黑盒子罩住了这些复杂的电路,进而产生了芯片,于是产生了各种的xPU: MCU、CPU、GPU、NPU等等。这是搞计算机人们的第一次分层,将电路2和逻辑分开,从此人们不再关注电路电气的特性,只需要阅读芯片手册就可以通过控制芯片的引脚通电电压,达到控制芯片的行为的目的,于是机器码出现了,就是4位、8位、16位、32位、64位、128位的0和1各种组合。

机器码出现了,使计算机科学分成两个流派,硬件和软件。硬件的玩家在卷集成规模、制程、功耗、工艺、设计艺术,这里提一句笔者搞过3年的EDA软件工具的研发,深知中国的IC领域和国外的差距,中国需要重视基础科学领域的投入,尤其是数学、物理学、化学,还有哲学(这个是工科领域急需提高的重视方向),华子海思确实牛B,大家还是要支持民族品牌。软件的玩家搞出了批处理(进程)、操作系统、HAL层、应用层、虚拟化(云计算)、各种协议、各种软件的架构。

有位令人尊重的老人家说过,分工是人类前进的基石。

汇编

(1) 落实到软件领域就是分层,机器码用起来不方便,就用字符代替,于是诞生了软件的第一个层次:汇编语言,能让码农方便的控制CPU的执行和内存的访问,硬件的家伙们给了你三条线(控制总线、数据总线、地址总线),让码农去玩吧。

操作系统

(2) 随着CPU的能力越来越强大,依附于CPU的SOC功能也越来越强大(尤其是愉悦人们身心的节目越来越多,哈哈),汇编太麻烦,也不方便人们管理硬件资源,于是第二次分层:OS操作系统的概念诞生了,这里面提一句,操作系统离不开C语言,就像西方不能失去耶路撒冷一样。操作系统诞生,解放了应用层开发的码农们,从此大家只需要关注自己的一亩三分地就行,只要按照系统提供的接口规范编程,下班就可以老婆孩子热炕头了。操作系统给你的一亩三分地就是进程,它受到了OS严格的保护,而且承诺给你的是整个硬件的全部。这里其实就是操作系统从时间和空间两个维度对底层资源的第一次虚拟化,使得每个进程都认为自己独占CPU,独占内存。下面图1-1 是这个阶段进程和操作系统视角,这时进程和系统看见的物理硬件是一样的,只是在操作的时候权限有所区别,系统的权限更高(当然进程间的权限也不一样)。
进程和操作系统视角的硬件

图1-1 进程和操作系统视角的soc硬件

VM(进程级别)

(3) 有了进程之后,软件的开发工作者们开始卷开发效率了,怎么提高开发效率(可维护性、可扩展性本质上都是效率问题),优化开发工具啊,那么就开始卷开发语言了。用C语言描述一条龙和用C++描述一条龙难度是不一样的,但是人们仍然不满足,因为大家发现,Intel的指令集(ISA)和ARM的指令集不一样,在一个平台上开发完,移植到另外一个平台仍然有很大的工作量,于是虚拟ISA诞生了,就是告诉那些不想关注指令集的码农吧,你们的春天来了。JAVA,Python等一众高级语言诞生,通过特定的编译器编译成通用的字节码(OS平台和硬件平台无关性),这些字节码是虚拟的字节码需要跑到虚拟的机器上,是的VM(virtual machine)诞生了。有了VM的存在,码农们解放了双手,降低了跨平台的难度,当然也是有代价的因为VM最终还是要将虚拟的ISA转换成具体平台的ISA去执行,这会带来一定的性能损耗。这里面是通过以进程为单位的形式通过进程级别VM以高级语言的形式向上层封装了一个虚拟的机器层次,降低了开发难度,提高了开发效率,这是对底层资源的第二次虚拟化。这里面优秀的代表,比如JVM、Py-VM、Dalvik、ART等。图1-2 展示了Android系统的软件架构,这里面的“Android Runtime(ART)”模块就是我们要关注的进程级别的VM,G家自己研发的这个VM到ART阶段已经优化的非常快了,但是核心的思想还是进程级别的虚拟化向上服务高级语言编程。
Android STACK

图1-2 Android系统的软件架构

VMM(系统级别)

(4) 以进程为单位的虚拟机虽然提高了开发效率,但是人们不满足于此,感觉不过瘾啊,因为有些人想把一个完整的操作系统OS,搞到另外一个系统上跑起来,或者把几个完整的OS搞到一个硬件平台上跑起来。这样的好处就是,可以把一个Android系统(娱乐系统)和一个QNX系统(驾驶系统)搞到一个soc上,或者把一个超强的SOC集群比如云端的大平台通过一个个Linux或者windows系统的形式仍然通过时间和空间两个维度的分割开来使用。这个阶段也分成两个流派,EmulationVirtualization。这两者的最重要区别就是是否能够硬件加速。Emulation可以把不同的ISA在一个特定的平台上跑起来,原理就是每条指令都做截获,模拟特定平台的ISA,比如一个在x86工具链环境下编译出来的镜像(Linux、Windows)在另外一个HOST系统(Linux(ARM)、Windows(x86)等)下跑起来,如图1-3所示,每条指令都模拟肯定慢啊。Virtualization的限制就比较多一些,一般会要求虚拟化系统和HOST系统为相同的ISA,编译时的工具链要相同,主要还是为了效率,如图1-4所示。不管是Emulation和Virtualization技术,大家会发现此时被仿真的系统以及这个系统中的进程都需要一个视角就是完整且独立的硬件平台视角(与物理平台可以不一致),他们会认为自己看到的就是完整的硬件平台,怎么才能做到啊?其实就是增强VM的能力,就是搞VM的Plus版本,那就是**VMM(Virtual Machine Monitor)**虚拟机监控器,就是通过这个增强版的VM层时时刻刻的监控被虚拟的OS(这里面我们成为Guest OS)的一切行为,进而提供完整的虚拟硬件(CPU、内存、外设)让Guest OS相信它拥有全部硬件世界,可以放心工作。
典型的Emulation架构

图1-3 典型的Emulation架构

典型的Virtualization架构

图1-4 典型的Virtualization架构

总结

上面介绍的几点都是虚拟化技术,大家的区别主要是,进程、高级语言是指令的执行环境的虚拟化,大家的硬件视角一致(都是物理硬件视角),但是VMM的虚拟化技术约束的是GuestOS,进而影响GuestOS上的进程的硬件视角(实际上是虚拟的硬件视角,可以不一致,有的时候甚至是互斥的)。从操作系统的视角看去,GuestOS在一般的虚拟化技术的实现下其实就是HostOS的一个进程,但是他看到的硬件视角被VMM给限制了(虚拟的soc),和HotstOS中其他进程是不一样。
总结一句话,虚拟化的思想:
底层的资源或者通过空间的分割,或者通过时间的分割,将下层的资源通过一种简单易用的方式转换成另一种资源,提供给上层使用。

结语

本篇主要介绍了,虚拟化的思想,从硬件到软件串联了虚拟化是如何产生的,其实就是为了降低开发难度和成本,最大效率的利用计算机硬件。限于篇幅,很多点没有展开讲,后期维护会慢慢完善。下一篇会给大家分享一下Hypervisor的概要。

★ virtualization:
[00] <80-ARM-VIRT-cs0004_Armv8架构虚拟化介绍.pdf>
[01] <aarch64_virtualization_100942_0100_en.pdf>
[02] <80-ARM-VIRT-cs0002_ARM虚拟化介绍.pdf>
[03] <80-ARM-VIRT-cs0003_ARM虚拟化技术简介.pdf>
[04] <Armv8-A-virtualization.pdf>
[05] <aarch64_exception_model_102412_0102_en.pdf>
[06] <80-VIRT-OVW-cs0009_虚拟化技术概述介绍.pdf>
[07] 指令集介绍 - <ISA****.pdf>
[08] 寄存器集合 - <SysReg****.pdf>
[09] <vd80-3xxx5-1c_AUTO_SAxxxx_QNX_HYPERVISOR_ARCHITECTURE_OVERVIEW_(CHINESE).mp4>
[10] <80-VIRT-CPU-cs0001_什么是CPU虚拟化.pdf>
[11] <80-VIRT-CPU-cs0002_CPU虚拟化.pdf>
[12] <80-VIRT-hyper-虚拟化(Hypervisor)技术详解.pdf>
[13] <80-VIRT-OVW-cs0010_Emulation和Hardware-virtualization的比较.pdf>
[14] <80-VIRT-OVW-cs0011_完全仿真与完全虚拟化.pdf>
[15] <80-VIRT-OVW-cs0004_虚拟化技术的实现-完全虚拟化-硬件辅助虚拟化.pdf>
[16] <80-VIRT-OVW-wx0003_车载OS-虚拟化技术与微内核的技术路线选择.pdf>
[17] <80-VIRT-OVW-cs0008_深入理解虚拟化.pdf>
[18] <79-V-KVM-lq0001_QEMU-KVM源码解析与应用.pdf>

Glossary

★ Glossary:
BE - Back End
FDE - Full Disk Encryption
FE - Front End
GVM - Guest Virtual Machine
QCPE - Qualcomm Protected Environment
SMMU - System Memory Management Unit
TZ - TrustZone
VM - Virtual Machine
vPE - virtual Processing Element (vPE)
ELs - Exception Levels
VMID - virtual machine identifier
TLB - translation lookaside buffer(地址变换高速缓存)
IPA - Intermediate Physical Address(IPA地址空间由Hypervisor控制)
VTTBR_EL2 - Virtualization Translation Table Base Registers(ArmV8 寄存器)
ASID - Address Space Identifier (ASID)
PSCI - Power State Coordination Interface
DVFS - Dynamic Voltage and Frequency Scaling (DVFS)
ACPI - Advanced Configuration and Power Interface (ACPI)
FDT - Flattened Device Tree
SCMI - System Control and Management Interface (SCMI)
KVM - Kernel-based Virtual Machine
SMMU - System Memory Management Units (SMMUs)
WFI - Wait For Interrupt (WFI)
GIC - Arm’s Generic Interrupt Controller (GIC)
IRQ - Interrupt ReQuest
FIQ - Fast Interrupt Request
VHE - Virtualization Host Extensions (VHEs)
BLSP - BAM low-speed peripheral
trap - 捕获(trap)
QUP - -Qualcomm Universal Peripheral
PCIe - Peripheral component interconnect express
C2C - chip 2 chip
SPMI - System power management interface
PMIC - Power Management IC
IC - Integrated Circuit Chip
HLOS - High level operating system
IFS - Initial File System
FDE - Full disk encryption
LCM - Lifecycle manager
VMM - Virtual Machine Manager
VMM - Virtual Machine Monitor
HCR - Hypervisor Configuration Register
PMSA - Protected Memory System Architecture
DMB - Data Memory Barrier
DSB - Data Synchronization Barrier
SPI - Shared Peripheral Interrupts (SPIs)
PPI - Private Peripheral Interrupts (PPIs)
SGI - Software Generated Interrupts (SGIs)
SDN - software defined networking
NFV - network functions virtualization 网络功能虚拟化
VBAR - Vector Base Address Register
SCTLR - System Control Register
ELR - Exception Link Register
ESR - Exception Syndrome Register
FAR - Fault Address Register
HCR - Hypervisor Configuration Register
SCR - Secure Configuration Register
SCTLR - System Control Register
SPSR - Saved Program Status Register
ISA - Instruction Set Architecture

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值