QEMU源码全解析 —— CPU虚拟化(1)

132 篇文章 41 订阅 ¥49.90 ¥99.00

接前一篇文章:

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

零、序言

一晃已经很久(4个多月)没有更新QEMU这个专栏了。并不是本系列已经完结了,也不是笔者不想写、或者已经失去了继续写作的兴趣,乃至失去了对于QEMU的兴趣。相反,笔者无时无刻不在想着继续将此专栏、专题写下去。只是由于自从今年3月初找了个兼职,就一直忙那个兼职的事情;而后又过了一个月,结束了4个多月的空档期,找到了新的全职工作,入职了新公司。无论是兼职还是全职,都是时间紧、任务重,再加上笔者又要备考系统架构师,因此虽然心里一直挂念着QEMU/KVM、挂念着本专栏,也不得不先紧着那几个优先度更高的工作(这才有了笔者后边的STM32音频和SD卡相关的文章,以及新开的ESP32-C3专栏)。现在兼职工作早已中止了,全职工作也基本理出了头绪,而下一次系统架构师的软考要到11月初才开始,因此,这段时间笔者终于有精力回到QEMU/KVM这个专栏,做自己最爱的研究方向了。

但是同时笔者也遇到了一个切实的问题,那就是由于离开的时间太长了,当初的延续性早已不在,需要一定的时间把之前的状态和节奏找回来。因此,笔者决定暂时不再继续之前没有写完的专题,如Machine或Virtio了(后续逐渐找回当时的进度后再继续),而是进入一个新的专题——CPU虚拟化。这样,一方面能够继续开展对于QEMU/KVM的研究,另一方面又不至于在没有完全找回状态和节奏的时候贸然续写前边的专题而导致很突兀、不完全对得上或完全对不上。

一、CPU虚拟化介绍

1. CPU虚拟化简介

在物理机中,操作系统也好、应用程序也罢,都是直接运行在硬件上的。以x86 CPU为例,其总共有ring0~ring3四个运行等级。而操作系统中的程序分为两种,即刚才提到的用户态程序(应用程序)和内核态程序(如内核代码、驱动程序等)。为了区分内核态和用户态,就需要把操作系统和应用程序分别对应到ring0~ring3这四个运行等级上。当时写Linux内核的时候,这些“远古大神”们还预料不到未来虚拟机会横空出世、大放异彩,因此他们“很奢侈地”敞开了用,让内核态(操作系统)的代码运行在ring0即第0等级,用户态(应用程序)的代码运行在ring3即第3等级。占了两头,中间的都不用,太不会过日子了,估计后来都得后悔死。

就这样,如果用户态程序做事情,就将扳手扳到第3等级,一旦要申请使用更多的资源,就要将扳手扳到第0等级。说得更清楚、细致一些,就是:当应用程序需要执行一些敏感操作、访问一些系统资源时,就需要执行特殊的指令陷入到操作系统内核,由内核进行一些安全检查,代替应用程序访问这些资源。能够在ring3即第3等级执行的指令叫作非特权指令,而只能在ring0即第0等级执行的指令叫作特权指令。

对于指令的划分,还有另一种方法,按照是否会对整个系统产生影响来划分。如果指令会影响到整个系统,则称为敏感指令;如果指令只影响自身所在的进程,则叫作非敏感指令。

在x86系统中,敏感指令与特权指令并不是完全相同的,存在一些指令属于敏感指令、但不属于特权指令,也就是说用户程序能够运行一些可以改变/获取全局资源的指令。这在物理机上没有什么问题,因为整个宿主机只属于当前这一个操作系统;但在虚拟化情况下就不一样了,虚拟化平台上会运行多个虚拟机,如果其中的操作系统都能够随意地读取/修改全局数据,那么就会十分混乱。因此,传统上有好几种方法来实现虚拟化。

  • Bohs与QEMU(不含KVM)类的纯软件模拟严格来讲并不算是虚拟化软件,而应该叫作模拟器,因为它们都是一条一条指令地解析、然后执行的。
  • 还有一类是VMWare早期的方案,虚拟化用户态的程序直接在CPU上执行,但是一些特权指令会通过动态的二进制翻译去执行。
  • 紧随其后的是Xen方案,该方案修改了虚拟机操作系统内核的代码,使虚拟机内核运行在ring1,并且对虚拟机中操作系统内核的敏感指令进行替换而使其陷入到ring0的Xen内核。

很明显各个方案都有缺点。纯软件模拟的性能非常差;Xen方案又只能支持有源码的操作系统;综合来看,VMWare的Workstation相对不错。

现如今,随着云计算的不断发展,作为其底层支撑技术的虚拟化技术也在飞快发展。Intel和AMD都相继在硬件层面支持了虚拟化,包括CPU、内存、磁盘、网卡等常见外设。硬件层面的虚拟化已经是云计算的标配。

更多内容请看下回。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>