《系统虚拟化——原理及实现》学习笔记

本文最后更新于:2025年6月30日 晚上

我将不断前进,直到——……

0.前言

关于这段时间……

学完0.11的linux内核之后给自己小小地放了个假。现在又要开始新的学习了。

休息的这一周感慨颇深。期间去了一次保研分享会,了解了其他保研er的故事。基于我先前了解过的信息,此刻我更确定我和他们不是一路人。

那晚我走在回寝室的路上百感交集,不由得去远望东面的综合楼。

在综合楼的1113,有着一群可爱的学弟学妹,正在为我们曾经的理想不懈奋斗。

他们义无反顾地接过了我们承接过的理想,在这片功利而又浮躁的校园里,这一切显得愈加耀眼而高大。

“NEUQRO必将薪火相传,生生不息.”

关于新的内容

坦白地说,写这段文字的时候我还没有开始虚拟化的学习。毕竟我这人一向擅长做先挖后填的勾当。

linux内核那篇,因为以前学过OS原理,先前也了解过linux的一些基本概念,所以读源码会快一些。当然,linux 0.11多少有点过于老旧了,所以我需要逐渐补充一些新知识。这可能有需要单独开一篇博客。

而虚拟化这边,因为没有太多基础,所以学起来就不大可能像linux内核那么快了。所以目前打算边记笔记边修改。这本书不大可能像0.11内核一样读两遍书就能理的差不多了。

ok,新的旅程,即将开始。

1.开篇

好像是讲了一堆定义。

2.x86架构与操作系统基础知识

2.1 x86历史与操作系统概要

2.2 x86内存架构

2.2.1 地址空间

地址空间可以分为物理地址空间和线性地址空间。

物理地址空间大小由CPU实现的物理地址位数决定(与CPU处理数据的能力没有必然联系)。除了内存之外,其他硬件设备的I/O寄存器也可以被映射进物理内存空间。

线性地址空间是由于为了实现进程之间的隔离而被引入,在实际运行时会被映射到具体的物理地址空间。其大小取决于CPU实现的线性地址位数。

2.2.2 地址

x86提供了段机制,这也就引入了一种额外的地址:逻辑地址,即段选择符+偏移量。由段选择符定位到段描述符再计算逻辑地址。

对于分页机制已启用的情况,地址的转化为:逻辑地址->线性地址->物理地址

对于未启用分页机制的情况,地址的转化为:逻辑地址->线性地址=物理地址(不需要查询页表了)

2.2.3 x86内存管理机制

分段,分页,在《Linux内核设计的艺术》里已经学过了

TLB,对最近的页面映射进行缓存。存放VFN->PFN的转换.

TLB存在缓存一致性问题,刷新TLB的方法有更新CR3和INVLPG指令两种方式。

3.虚拟化概述

可虚拟化架构和不可虚拟化架构

敏感指令,特权指令。

特权指令触发异常,由VMM捕获。

敏感指令涉及对系统资源的操作。如果敏感指令不全是特权指令,在执行的时候就不会出发异常,让VMM无法捕获,而造成影响。这种缺陷可以弥补,但是需要额外付出开支。

处理器虚拟化

虚拟处理器≈物理处理器+VMM

指令的模拟

敏感指令涉及到的寄存器有专门的虚拟寄存器设定。相关操作定位到虚拟寄存器上。

虚拟处理器在进行状态切换的时候,需要保存的信息上下文信息更多。如上面说的因敏感指令而生的虚拟寄存器。

关键问题在于如何在执行到敏感指令的时候唤醒VMM进行专门的处理。这是利用了中断和异常处理的。

有三种方式:基于保护机制(特权不足),虚拟机主动触发异常(自己检查),以及异步中断。

中断和异常的模拟及注入

VMM对于虚拟机指令抛出的异常,要做两种区分:一种是在即便运行环境换成物理机也会出现的异常,即完全属于虚拟机操作系统运行的原因产生的异常。另一种则是上文说的因敏感指令而产生的异常。

后者触发的原因是由于虚拟化技术实现的需要,换句话说如果这里不是虚拟机而是物理机,就不会出现这个异常。而前者则是虚拟机运行的上下文中出现了会导致抛出异常的情况。

类似于物理中断,虚拟中断的触发需要虚拟中断源,这一般来自于外源设备。

多处理器

太困了今晚不看了

内存虚拟化

虚拟出来的内存必须要有两点特性:

  1. 从0开始
  2. 至少保证大粒度的连续。

然后需要解决两个问题:

  1. 宿主机逻线性地址和虚拟机物理地址的映射
  2. 指令执行时对于寻址行为进行截获和额外处理

映射

GVA,GPA,HVA,HPA四个概念

VMM插手从GPA到HPA的过程(为何跳过了HVA呢?因为VMM是和运行在宿主机上的操作系统是一个等级的,所以它能直接控制物理内存吧也许),它需要不断跟踪客户机的页表,在其发生变化时,构造一个与之相应的GPA到HPA的转化过程。

截获

地址转换必须发生在指令执行前


《系统虚拟化——原理及实现》学习笔记
http://example.com/2024/11/18/Blog/IIE/Basic/系统虚拟化-原理与实现——学习笔记/
作者
Jmp.Cliff
发布于
2024年11月18日
许可协议