Linux入门攻坚——76、虚拟化技术基础原理-1

虚拟化技术是计算机领域最重要的技术之一,需要深入学习理解其原理。想要理解虚拟化技术,需要对计算机软硬件组成、架构、操作系统等有一个概括的了解。

计算机原理

当前使用的计算机,绝大多数还是属于冯诺依曼架构,冯诺依曼计算机的基本原理核心是‌存储程序原理‌,即计算机将程序指令和数据以二进制形式共同存储在内部存储器中,控制器能够自动、高速地按顺序从存储器中取出并执行指令,从而实现自动化处理。‌‌

冯诺依曼架构计算机有五部分组成,分别是:运算器(又称算术逻辑单元ALU)、控制器(CU)、存储器(Memory)、输入设备和输出设备(I/O设备)。

现代计算机中,运算器ALU与控制器CU封装在一起形成中央处理单元CPU,存储器又分为主存(Memory)和辅存,辅存包括了软盘、硬盘、光盘、磁带等,CPU与主存结合,形成了主机,输入设备、输出设备、辅存构成了外部设备。

硬件之上是软件,软硬件结合构成一个完整的计算机系统,计算机系统的层次结构如下:

软硬件之间的交界面,即为指令集,指令集完成软硬件的链接,指令集对下,要有具体的硬件电路实现,对上,为软件提供编程指令。这里的虚拟机器M2-4,与要学习的虚拟化技术不是一个概念,它是从硬件有实物的角度,将软件等无法触摸到的,但是对外表现出一台机器不同特征的各层叫做虚拟机器,这是从计算机系统的层次结构角度观察一台完整机器的结构。

关于CPU, 要理解CPU的运行权限,即特权级别,以及上层虚拟机器,主要是操作系统对CPU的使用。现代CPU,如Intel的x86系列CPU,是有4个特权级别的:RING0,RING1,RING2,RING3。Windows和Linux系统仅采用RING0(内核态)及RING3(用户态)两个层级,RING0为最高特权,供操作系统内核使用,RING3供普通应用程序使用,用户态程序企图执行RING0指令,CPU将触发保护错误。

在进一步理解,就是CPU的指令运行是分级别的 ‌,这种分级主要体现在‌特权级别(Privilege Levels) ‌上,用于保障系统安全与稳定性。

特权级别机制:

Intel x86 架构将 CPU 指令的执行权限划分为4 个特权级别,从高到低依次为:

  • Ring 0(最高权限)
  • Ring 1
  • Ring 2
  • Ring 3(最低权限)

● Ring 0:操作系统内核运行于此,可执行所有指令,包括直接访问硬件、修改内存管理寄存器等。

● Ring 3:普通应用程序运行于此,权限受限,不能直接执行 I/O操作、访问物理内存或修改关键系统状态。

为什么需要分级?

● 防止误操作:若应用程序随意执行特权指令(如关中断、清内存),可能导致系统崩溃。

● 安全隔离:通过硬件级权限控制,阻止恶意程序破坏内核或其他进程。

● 稳定运行:关键系统资源仅由内核管理,确保多任务环境下的资源有序分配。

权限切换示例

当应用程序需要访问硬件(如读写磁盘)时,必须通过系统调用(System Call)触发从Ring 3 到 Ring 0 的特权级别提升,该过程由 CPU 硬件支持,并涉及:

● 保存用户态上下文

● 切换到内核栈

● 执行内核代码

● 完成后恢复用户态并返回 Ring 3

此机制是现代操作系统"用户态/内核态"分离的基础 。

其他架构(如 ARM)采用不同机制(如 Exception Levels EL0--EL3),但同样实现指令权限分级 。

内存的使用,CPU访问内存的简化过程:

冯诺依曼计算机,就是存储程序结构,CPU需要的指令、数据,大都是从内存中来的,CPU访问内存时,先将内存地址送入MAR寄存器(内存地址寄存器),再由MAR送到存储体,即内存电路中,然后在控制单元发出的读/写控制信号,完成内存的读/写,读就是将内存对应的MAR送入的地址的内存内容送入MDR(内存数据寄存器),写就是将MDR内容送入内存对应的地址中。

这里的MAR中的地址,是物理内存的地址,这个地址是直接对应了实际的物理内存的。而现代的存储器,使用了段页式管理机制。

进程运行时使用的是虚拟内存,即假设整个物理内存只有自己和内核,内核固定于顶部1G空间,剩下的由进程独自占用,进程指令中使用的内存地址是线性地址或叫做虚拟地址,因为独占内存,进程可以自由的按顺序使用空间,不需考虑物理内存的实际情况,降低程序复杂性,而实际使用的物理内存,则通过一定的机制,将线性地址转换为物理地址,通过上图,可以看到线性地址,两个进程是冲突的,或者说,多个进程的线性地址是随意共用的,最终通过地址映射,对应不同的物理地址空间,这个地址的转换,在CPU中有专门的部件,就叫做MMU(Memory Management Unit,内存管理单元)。MMU是通过查询Page Table页表(PT)实现地址转换:

内存分页的思想使用虚拟地址映射物理地址,分配单位变成了固定长度的较小的内存区域,这些虚拟内存块被称为页 Page(大小通常为4K Bytes),而其对应的物理内存则被称为页帧 Page Frame,每一Page都可以映射到一个对应的Page Frame中。

在操作系统开始运行后,会存在数以百万计的Page->Page Frame映射关系,这些映射关系以某种结构存储在某个地方,形成了叫做页表(Page Table) 的存储结构来存储映射信息。因为在内存中又比较大,速度慢,又叫做慢表;为了加快转换速度,引入高速缓冲存储器------快表TLB(Translation Look-aside Buffers),叫做转译后备缓冲区,又称页表缓存、转址旁路缓存。

CPU读/写内存的过程,增加了MMU:

I/O设备的组成:包括了设备控制器和设备本身

控制器:集成在主板上的一块芯片或一组芯片;

驱动程序:通常由设备生产商开发,位于内核中;

每个控制器都有少量的用于通信的寄存器,每个寄存器表现为一个I/O端口,所有I/O的寄存器组合起来,叫做主机的I/O地址空间或I/O端口空间;与设备交互,只需与对应I//O端口交互即可。I/O地址为16位,共有65535个地址空间。

I/O地址也涉及访问内存时的地址映射转换问题,具有IOMMU单元,实现类似MMU的功能。

虚拟化技术概述

我们这里要学习的虚拟化技术,我理解的其逻辑结构与计算机系统的层次结构角度的对应如下:

虚拟化(Virtualization)存在时间是很久远的,针对不同需求有不同的虚拟化技术。很早以前,人们担心是否有足够的内存来存放自己的程序,为此出现了虚拟内存,如Linux的swap分区,Windows的虚拟内存pagefile.sys等;为了更好的共享大型机系统,出现了虚拟服务器;还有网络虚拟化、微处理器虚拟化、文件虚拟化和存储虚拟化等。虚拟化,抽象来说是资源的逻辑表示,实现形式是在系统中加入一个虚拟化层,虚拟化层将下层的资源抽象成另一形式的资源,提供给上层使用。是通过空间上的分割、时间上的分时以及模拟等实现。而上图的虚拟化,是系统虚拟化,其抽象的粒度是整个计算机。

系统虚拟化,就是在一台真实的物理机器上,安装了宿主机(即虚拟机器M2-4),或者VMM\Hypervisor------虚拟机监控器,在其上又以软件的形式,虚拟出多台虚拟机,这些虚拟机包括了虚拟机器M2-4,它们对外表现的就像是真实的跑在另一台物理机器上,而实际上是跑在一台虚拟物理机上,这台虚拟机上的动作最终都是在真实物理机器上运行的,所以虚拟机是通过宿主机\VMM最终还是运行于物理机器上。从外在表现看,从上图看,一台计算机系统,好像是多台计算机系统。

那么,虚拟物理机再深一层分析,要虚拟什么东西呢?其实就是计算机组成的那些部分,包括CPU、主存、I/O等。

CPU要虚拟的一个是它的功能,如要能运算,能控制等,一个是它的指令集,我们可以为x86系列的CPU虚拟出多个也是x86的虚拟CPU,也可以虚拟其他系列,如ARM系列的CPU。很明显,同系列的CPU,上层虚拟机的指令基本不需要过多处理就可在物理CPU上运行,不同系列CPU,宿主机或VMM就要做指令转换,额外花费就高。

主存的虚拟化,就是在物理主存中如何划分一段,并如何管理、使用的问题;

I/O的虚拟化,就是在虚拟机和真实I/O之间增加一个联通的管道,让这个管道在虚拟机看起来是一个I/O;

CPU的虚拟化,可以看成是对CPU划分时间片,如虚拟了三台虚拟机,相当用户将CPU时间划成三片,三台虚拟机分别使用不同的时间片;内存的虚拟化,则是物理内存的划分,将物理内存划分成三段独立空间,分别作为各自的内存管理使用;I/O的虚拟化,如硬盘,可能是使用三个文件或三个分区来虚拟不同机器的硬盘,也是将物理硬盘划分,类似内存,其他如键盘鼠标等,则类似CPU,也是划分时间片使用。

虚拟化的一个问题是,虚拟机上的操作系统,其使用CPU,默认是在内核态的,但是,虚拟机作为宿主机的一个应用,整体是一个用户态进程,这里就牵扯到虚拟的内核态如何在真实CPU上运行的问题,即特权级的问题。

另外一个问题是,虚拟机上使用的内存访问机制,也是线性地址到物理地址的转换,中间通过MMU,但是我们知道实际上这个转换后的物理地址也不是真正的物理地址,还需要宿主机或VMM再次进行转换,也就是说第一次的转换是无用的。

所以,了解计算机运行的原理,是为了分析虚拟机需要虚拟什么,哪些过程又是无用的或无效的,从而为改进虚拟机性能做准备。这可以从硬件上改进,使硬件具有支持虚拟化的技术,或从软件改进,去掉无效的中间过程。

虚拟化技术具体分析

虚拟化实现的两种实现方式:分为Type-I型和Type-II型

● Type-II型(硬件上安装宿主机):就是在一台完整的计算机系统上,安装一个虚拟机软件,通过这个软件,虚拟出多台虚拟机,这台完整计算机系统叫做宿主机,即Host Machine,它除了可以跑虚拟机软件,还可以运行其他任何应用软件,也是个人最常用的虚拟机技术。如我现在正在使用的vmware Workstation虚拟机软件,我的宿主机是一台Windows7系统的2017年产的联想台式机,在其上安装了vmware Workstation,然后虚拟出多台CentOS系统,这个虚拟机叫做客户机Guest Machine。类似的虚拟机软件有kvm,vmware workstation,virtualbox等。

● Type-I型(硬件上安装hypervisor/VMM):这种类型虚拟机,是在硬件上安装Hypervisor这个虚拟机监控器,Hypervisor上只运行虚拟机管理软件和虚拟机,一般不运行其他应用程序,可以看成是专用于虚拟化的操作系统,这个类型的包括xen,vmware ESX/ESXi等。

虚拟化技术的分类:

● 模拟:Emulation,著名的模拟器 ------ PearPC,Bochs,QEMU

模拟,可以想到的同义词模仿,即本质上不是一个东西,就像一个黑盒子,外在表现相同,内里完全不一样。如Bochs,是一个x86硬件平台的开源模拟器,Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS,在任何能编译运行Bochs的平台上模拟x86硬件,如在ARM架构的手机上运行,能够模拟出x86的PC机;PearPC则旨在在采用x86处理器的PC上模拟PowerPC架构的电脑,从而运行Mac OS X及其他操作系统;QEMU主要用于操作系统和硬件平台的仿真。相比Bochs、PearPC等同类软件,QEMU具备更高运行效率和跨平台特性。其核心功能包含用户模式模拟和系统模式模拟:前者支持跨CPU架构运行应用程序,后者可完整虚拟化计算机系统并提供软驱、显卡、网卡等硬件模拟环境。该软件默认支持x86、AMD64、MIPS、LoongArch等多种处理器架构,通过与KVM、HAXM等加速技术结合,显著提升虚拟化性能及运行稳定性。QEMU采用动态二进制翻译技术并支持即时编译功能,支持龙架构(LoongArch),允许在X86平台调试LoongArch架构程序及系统。QEMU主要有两种核心运行模式:纯软件模拟(Emulator)与硬件辅助虚拟化(Virtualizer)。纯软件模拟模式下,QEMU通过动态二进制翻译(Dynamic Binary Translation)将一种CPU架构(如ARM)的指令实时翻译成另一种架构(如x86)的指令,以实现跨架构运行程序。硬件辅助虚拟化模式下,当QEMU运行在与宿主机相同的CPU架构上并配合KVM(基于内核的虚拟机)使用时,可以利用CPU的硬件虚拟化扩展(如Intel VT-x或AMD-V)直接执行客户机代码,从而获得接近原生硬件的性能。在KVM架构中,KVM负责处理CPU和内存的虚拟化,而QEMU则负责模拟虚拟机所需的所有I/O设备,并作为进程管理者提供管理接口

● 完全虚拟化:Full-Virtualization,也称为native virtualization,要求架构要一致;

两种加速方式:BT、HVM;

相关软件: VMware Workstation,VMware Server,Parallels Desktop,KVM,Xen(HVM)

完全虚拟化Full-Virtualization,是一种传统虚拟化技术,也称为原始虚拟化技术,抽象的虚拟计算机具有完全的物理计算机特征,通过虚拟机监控器(Virtual Machine Monitor,VMM)或超级监控程序(Hypervisor)来完全模拟硬件环境,上层虚拟机的操作系统完全需不要修改,或者说完全感知不到下层是虚拟物理机,就像运行在一台真实物理机中一样。其一般使用加速技术BT、HVM等。

BT: 二进制翻译(Binary Translation)是一种直接翻译可执行二进制程序的技术,能够把一种处理器上的二进制程序翻译到另外一种处理器上执行,主要包括解释执行、静态翻译和动态翻译三类方法。

HVM:HVM 创建与物理计算机非常相似的 VM。它虚拟化了底层硬件,包括处理器、内存和存储。HVM 允许运行不受修改的操作系统,包括 Windows、Linux 和 macOS。它通常用于需要高性能和对底层硬件完全访问的应用程序。

● 半虚拟化:para-virtulization,架构要一致

相关软件:xen,uml(user-mod linux)

提供对底层硬件的部分模拟,以满足某些专门的软件的执行环境,但并不能运行所有可能运行在物理机上的软件。GuestOS,即客户机OS知晓自己运行在Virtulization中,能够与虚拟进程进行协作,这种技术通过修改操作系统内核中的硬件访问指令,将其重定向到虚拟机监控程序,从而实现对硬件资源的访问。执行的系统调用是Hyper call,即直接调用了Hypervisor层提供的系统调用,而不是虚拟机操作系统的系统调用(system call),越过一层调用,性能提升,但GuestOS需要特别定制,灵活性降低。

● OS级别虚拟化:

相关软件:OpenVZ,lxc,FreeBSD jails,Solaris Containers

没有VMM,仅有分隔的多个用户空间,一般叫做容器级虚拟化。容器共享主机内核,但具有自己隔离的文件系统和资源。容器虚拟化提供了更轻量级的虚拟化方法,非常适合微服务和云原生应用程序。

● 库虚拟化:

如wine,在一个系统上提供模拟另一个系统运行时需要的各种库文件,即提供另一个系统程序运行需要的各种环境条件,wine就是在linux系统上提供一套模拟windows的程序运行时需要的各种库,可以使windows程序在linux系统中运行。

● 应用程序虚拟化:像Java虚拟机jvm,Python虚拟机pvm等;

● 桌面虚拟化:

通过远程连接,允许用户从任何设备访问他们的桌面环境,无论其物理位置如何。桌面虚拟化通常用于远程工作、教育和虚拟桌面基础设施 (VDI) 解决方案。

计算机部件的虚拟化概念

CPU虚拟化:

模拟:emulation,纯软件

虚拟:virtualization

● 完成虚拟化(full-virtualization)

BT:二进制翻译(软件)

HVM:硬件辅助虚拟化(硬件)

● 半虚拟化(para-virtulization)

vm monitor = hypervisor (hyper call)

硬件对虚拟化技术的支持:HVM

CPU具有4个ring环(在虚拟技术中,出现ring-1环,即虚拟化中CPU具有5个ring环)

Memory虚拟化:

进程:线性地址空间

内核:物理地址空间

MMU Virtulization:

Intel - EPT,Extended Page Table

AMD - NTP,Nested Page Table

TLB Virtulization:

tagged TLB

shadow page table

MMU和TLB的硬件虚拟化支持,使得客户机上的虚拟线性地址到虚拟物理地址的转换得以节省,直接到物理主机上的物理地址的转换。

I/O虚拟化:

外存:硬盘、光盘、U盘

网络设备:网卡

显示设备:VGA

键盘鼠标:ps/2,usb

I/O虚拟化的方式:

● 模拟:完全使用软件来模拟真实硬件;

● 半虚拟化:IO frontend 、 IO backend (适用磁盘、网卡等);显卡,frame buffer机制;

● IO-through:IO透传,让虚拟机直接使用物理设备(需要hypervisor辅助),硬件也要支持;

Intel:VT-d,基于北桥的硬件辅助的虚拟化技术;

"IO frontend"(输入/输出前端)是虚拟化技术中的一个关键组件,主要用于在虚拟机(Guest VM)与宿主机(Host)之间高效地处理 I/O 请求。核心概念:

● IO frontend 运行在虚拟机内部(Guest OS),负责接收来自虚拟机中应用程序的 I/O 请求(如磁盘读写、网络收发)。

● 它将这些请求通过半虚拟化接口(如 Xen 的 virtio、KVM 的 virtio 等)转发给IO backend(运行在宿主机或特权域,如 Dom0)。

● IO backend 负责将请求转换为对真实物理硬件的操作,并将结果返回。

IOMMU: Intel:VT-d

IOMMU(输入输出内存管理单元)是计算机系统中用于管理和映射设备直接内存访问(DMA)物理地址的硬件技术,其功能类似于CPU的内存管理单元(MMU)。IOMMU通过地址转换解决32位设备在64位系统中的内存访问限制,并简化设备驱动对分散物理内存的访问。在虚拟化场景中,其支持DMA重映射和中断重映射以提升设备隔离与安全性,在虚拟化环境中至关重要,IOMMU独立于CPU的内存管理单元(MMU)运行,能够加速各个来宾(虚拟机)虚拟地址空间之间的地址转换,并将物理内存地址重新映射到虚拟机(子分区)所使用的地址。

Intel公司和AMD公司都推出了带有硬件虚拟化支持的处理器,Intel的Virtualization Technology(VT)技术和AMD的Secure Virtual Machine(SVM)技术,保证x86架构是一个可虚拟化的架构。

Intel的硬件虚拟化技术是一套由英特尔开发、用于在x86架构上实现高效虚拟化的硬件辅助技术体系,主要包括 VT-x、VT-d 和 VT-c 三大核心组件,分别针对CPU、I/O设备和网络连接进行虚拟化优化。核心技术组成:

VT-x(CPU虚拟化)

● 引入 VMX根模式(VMM运行) 和 非根模式(客户机运行),通过硬件指令(如VMLAUNCH、VMRESUME、VMEXIT)实现模式切换。

● 使用 VMCS(Virtual Machine Control Structure) 保存虚拟机状态。

● 支持 EPT(Extended Page Tables),实现客户机物理地址到宿主机物理地址的二级转换,显著提升内存访问性能。

VT-d(定向I/O虚拟化)

● 提供DMA重映射、中断重映射和设备直通分配功能,使虚拟机可安全直接访问物理I/O设备(如网卡、GPU)。

● 基于 IOMMU(输入输出内存管理单元) 实现内存隔离与保护,防止虚拟机逃逸攻击。

● 支持 PCI-SIG SR-IOV(单根I/O虚拟化),允许单个物理设备呈现为多个虚拟功能(VF)。

VT-c(连接虚拟化)

针对网络I/O优化,集成于Intel以太网控制器中。核心技术包括:

● VMDq(虚拟机设备队列):在网卡硬件层面完成数据包分类,减轻CPU负担。

● VMDc(虚拟机直接互连):结合SR-IOV,实现虚拟机直连网络硬件 。

启用与验证方法:

确认处理器支持:

访问 Intel产品规格页面,查看"高级技术"中是否包含:

Intel® VT-x、Intel® VT-d、Intel® VT-c。

BIOS/UEFI中启用:开机时按 Del/F2 进入BIOS,通常在以下路径启用:

Advanced → CPU Configuration → Intel Virtualization Technology(启用)

Advanced → Chipset → Intel VT-d(启用)(部分主板)。

操作系统验证:

Windows:打开任务管理器 → "性能"标签 → 查看"虚拟化"是否显示"已启用"。

Linux:运行命令 grep -E "(vmx|svm)" /proc/cpuinfo,若输出包含 vmx(Intel)则支持VT-x 。

Intel硬件辅助的虚拟化技术:

CPU:vt-x,ETP,tagged-TLB

IO/CPU:vt-d,IOV,VMDq

Intel硬件辅助的虚拟化技术其分类:

第一类:跟处理器相关:vt-x

第二类:跟芯片相关(I/O设备):vt-d

第三类:跟虚拟链接相关:vt-c,VMDq和SR-IOV

PCI标准组织制定在PCI设备级对虚拟化进行支持的技术:单根PCI桥IOV(Single Root IOV,SR-IOV)和多根PCI桥IOV(Multi-Root IOV)标准。

相关推荐
yyuuuzz1 小时前
企业出海aws运维常见问题梳理
运维·服务器·网络·数据库·aws
cui_ruicheng1 小时前
Linux线程(四):线程池、日志系统与单例模式
linux·开发语言·单例模式
AOwhisky1 小时前
Docker 学习笔记:网络篇
linux·运维·网络·笔记·学习·docker·容器
Bat U1 小时前
JavaEE|网络编程
运维·服务器·网络
gs801401 小时前
避坑指南:Nginx 多层代理下的“404”与“重定向死循环”深度排查
运维·nginx
被放养的研究生2 小时前
Windows 与 Linux 文件系统区别及常见对应关系
linux·运维·windows
怀旧,2 小时前
【Linux系统编程】23. 线程同步与互斥(下)
linux·运维·服务器
西贝爱学习2 小时前
pdf转TXT文本,适用于文字型PDF;扫描版PDF需要使用OCR(光学字符识别)技术来识别图中的文字
java·服务器·前端
偶尔上线经常挺尸2 小时前
《每日一命令18:iptables——Linux防火墙入门》
linux·运维·服务器·iptables·防火墙