当前位置:首页 > 每日看点 > 正文内容

虚拟机是怎么实现的?

卡卷网11个月前 (12-22)每日看点143

问题有点大,笼统的试答一下。坑比较深,最好有基本的OS基础才好理解。

假设这里的虚拟化是指在一个OS下虚拟化另外一个OS(ESX那种hypervisor直接跑在硬件上的做法,其实大同小异),另外假设这里的虚拟化是指full virtualization而不是Xen那种para-virtualization。最后假设虚拟化的是一个早期的x86机子(没有hardware supported virtualization的存在)。

要回答这个问题,首先看为什么一个OS无法直接与另外的OS共存。答案很简单,OS作为硬件上第一层软件,认为自己拥有全部的硬件的访问和控制权,且自己是唯一的控制者。在这种情况下,如果两个OS共存,必然产生问题。

OS主要负责管理的是CPU和内存,以及众多的IO设备。于是我们可以分别讨论。hypervisor是实现虚拟化的关键,它会以一个内核态的驱动存在。


CPU的虚拟化:

背景知识:x86 CPU有一项权限机制,把CPU的状态置于RING 0到RING 3分别使CPU具有最高的权限到最低的权限。以Linux为例,内核运行于RING 0上,而其余全部用户进程运行于RING 3上(Xen比较奇葩,Linux在Xen下面会运行于RING 1)。在用户权限下,所有的IO设备是不可操作的,另外,有些控制寄存寄是无法访问的,一些privilege的指令是不能运行的。因此一个用户进程要想读写文件,进行一些操作,就要依赖于内核。系统调用能够使CPU运行于RING 0,并执行内核代码(具体方法见一些操作系统教程)。

背景说完。一个CPU的全部状态其实就是所有寄存器的值,只要保证任何操作之后寄存寄的值在OS看来是正确的,guest OS就可以正常执行。hypervisor会为每个虚拟的CPU创建一个数据结构,模拟CPU的全部寄存器的值,在适当的时候跟踪并修改这些值。

那么考虑虚拟化一个CPU,在虚拟化的guest OS里面,CPU无论如何也不可能运行于RING 0,因为这样的话,host OS必然会crash掉。因此,当一个guest OS想要进入到RING 0执行内核代码时,hypervisor会向guest OS说谎,并告诉它,你已经在RING 0上了,而实际上,所有的指令还是在RING 3上。当guest OS访问到任何privilege的东西时,hypervisor会接到fault,此时hypervisor会判断这个指令是什么,并修改相应的虚拟寄存器的状态,然后返回。这样guest OS就可以正常的运行。需要指出的是,在大多数的指令下代码是直接跑在硬件上的,而不需要软件介入。只有在一些权限高的请求下,软件会介入,并维护虚拟的CPU状态。

内存的虚拟化:

背景知识:虚拟内存,页表结构等。OS的基础内容,不表。

hypervisor虚拟化内存的方法是创建一个shadow page table。正常的情况下,一个page table可以用来实现从虚拟内存到物理内存的翻译。在虚拟化的情况下,由于所谓的物理内存仍然是虚拟的,因此shadow page table就要做到:虚拟内存->虚拟的物理内存->真正的物理内存。

以下是细节,如果看着闹心,请忽略。hypervisor会维护一个从虚拟内存到物理内存的映射,当guest OS更换自己的page table,也就是改变CR3寄存器的值,hypervisor会因为用户态的权限不足而接到一个general exception,hypervisor会记录用户想要更换的新的页表,并放上一个空的shadow page table,然后返回。这个空的shadow page table会在接下来的执行中造成CPU无法进行地址翻译,而产生page fault。在fault发生后,hypervisor会得到一个虚拟地址,然后根据之前记录的用户的页表结构,翻译出一个虚拟机器地址,然后再把这个虚拟的机器地址,由hypervisor维护的映射翻译为实际的机器地址,然后装入shadow page table,并返回执行。如此,就实现了:虚拟内存->虚拟的物理内存->真正的物理内存。

I/O虚拟化:

背景知识:memory mapped I/O device。大多数的PCI设备都是直接将自己的某些控制寄存器映射到物理内存空间上,CPU访问这些控制寄存器的方法和访问内存相同。CPU通过修改和读取这些寄存器来操作I/O设备。

虚拟化的方法很简单,没当hypervisor接到page fault,并发现实际上虚拟的物理内存地址对应的是一个I/O设备,hypervisor就用软件模拟这个设备的工作情况,并返回。比如当CPU想要写磁盘时,hypervisor就把相应的东西写到一个host OS的文件上,这个文件实际上就模拟了虚拟的磁盘。


这里忽略了很多异常处理等等细节,但求简化,可是貌似还是写多了。以上。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/5169.html

分享给朋友:

相关文章

4000以下的手机有没有推荐的啊?

4000以下的手机有没有推荐的啊?

可以选择标准版的旗舰机型:vivo X100s、一加12、OPPO Find X7、小米14、iQOO 12;也可以选外观时尚的自拍影像机型:vivo S19 Pro、realme GT 5 Pro、荣耀 200Pro、小米 Civi 4...

网易云音乐里有哪些打动你的评论?

1.“如果我被强奸了,有人说我会失去贞操。”“我怎么失去贞操了呢?” “我的贞操不在我的阴道里。”“失去贞操的是强奸犯,而不是被强奸的人。”2.但要记得那年海边的烟火,我们不拘一格 ,嘲笑过生活。………网易云热评《这样就很好》3.“ 我们在...

为什么说不懂电脑的不要碰AMD?

作为一个资深垃圾佬,说缺点前,先说优点吧AMD CPU(后续简称AU)的优点:处理器对比Intel,三级缓存更大,最明显的感知就是,网游帧数更高(5900X,7900X之类高端型号都是双CCX共享大缓存,反而不如次一点的CPU帧数更高);相...

为什么雷军身上没有酒色财气?

武大建校130周年时,雷军向母校个人捐款13亿。在2023年8月14日晚上七点,雷总在国家会议中心举行的进行第四次年度演讲「成长」:全篇都在谈成长、梦想,这么多年了,始终做到了知行合一,我相信酒色财气可能真不是他所追求的,一直追求的就像他演...

如何评价小米14这款手机?

如何评价小米14这款手机?

本来小米 14 和 14 Pro 是打算放一起拆的,但是因为时间关系,实在凑不到一起了。所以今天给大家补一篇详细的图文拆解,基本信息都有了,如有遗漏可以在评论区留言。双卡上下放置,卡托材质为金属 + 塑料,内侧有防尘防水的胶圈。后盖为玻璃材...

你怎么看待软件测试这个工作的?

你怎么看待软件测试这个工作的?

先说一个插曲:上个月我有同学在深圳被裁员了,和我一样都是软件测试,不过他是平安外包,所以整个组都撤了,他工资和我差不多都是14K。现在IT互联网已经比较寒冬,特别是软件测试,裁员先裁测试,这几乎都是定律。我最近看了某音很多应届生以及去年毕业...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。