<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>虚拟化 &#8211; 寂静花园</title>
	<atom:link href="https://www.addesp.com/archives/tag/%E8%99%9A%E6%8B%9F%E5%8C%96/feed" rel="self" type="application/rss+xml" />
	<link>https://www.addesp.com</link>
	<description>寂静中交织着热情</description>
	<lastBuildDate>Mon, 25 Oct 2021 15:41:12 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>IA-32 架构的纯软件虚拟化解决方案简介</title>
		<link>https://www.addesp.com/archives/1891</link>
					<comments>https://www.addesp.com/archives/1891#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Fri, 02 Oct 2020 17:26:25 +0000</pubDate>
				<category><![CDATA[虚拟化技术]]></category>
		<category><![CDATA[虚拟化]]></category>
		<guid isPermaLink="false">https://www.addesp.com/?p=1891</guid>

					<description><![CDATA[IA-32 架构起初并不是为了虚拟化设计的，它的目标是在处理器上运行最多一个操作系统，所以在 Intel VT 出现之前， IA-32 架构上的虚拟化解决方案就只有纯软件虚拟化了。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">写在前面</h2>



<p class="wp-block-paragraph">本文章属于虚拟化技术系列文章，<strong><a href="https://www.addesp.com/shuoshuo/%e3%80%8c%e8%99%9a%e6%8b%9f%e5%8c%96%e6%8a%80%e6%9c%af%e3%80%8d%e7%b3%bb%e5%88%97%e5%bc%80%e5%9d%91" target="_blank" rel="noreferrer noopener">点击查看本系列的说明</a></strong>。</p>



<p class="wp-block-paragraph">阅读本文请先阅读下面的<a href="/archives/1877" target="_blank" rel="noreferrer noopener" title="/archives/1877">虚拟化技术的术语</a>以了解相关术语。</p>



<h2 class="wp-block-heading">IA-32 架构面临的挑战</h2>



<p class="wp-block-paragraph">IA-32 架构起初并不是为了虚拟化设计的，它的目标是在处理器上运行最多一个操作系统，所以在 <a href="https://baike.baidu.com/item/Intel%20VT/2091588" target="_blank" rel="noreferrer noopener">Intel VT</a> 出现之前， IA-32 架构上的虚拟化解决方案就只有纯软件虚拟化了。</p>



<h3 class="wp-block-heading">IA-32 架构的权限等级</h3>



<p class="wp-block-paragraph">Intel 处理器提供了四种权限级别，分别为 Ring0、Ring1、Ring2 和 Ring3，权限依次降低，Ring0 拥有最高权限。所以一些特权指令只能在 Ring0 下才可以正常使用。大多数 IA-32 架构的应用运行在 Ring3。</p>



<p class="wp-block-paragraph">然而一些操作系统的组件必须运行在 Ring0，但是要实现纯软件的虚拟化就必须让 VMM 独占 Ring0。因为 VMM 要虚拟化出若干组硬件来供 GuestOS 使用，这就要保证 GuestOS 不能直接控制物理硬件。</p>



<h3 class="wp-block-heading">特权解除和陷入模拟</h3>



<p class="wp-block-paragraph">因此出现了一种技术被称为“特权解除和陷入模拟”。</p>



<p class="wp-block-paragraph">特权解除是指将 VMM 运行在 Ring0，而虚拟机中的操作系统运行在 Ring1。这样就可以保证 GuestOS 无法越过 VMM 去执行特权指令导致虚拟化失效。</p>



<p class="wp-block-paragraph">同时由于 IA-32 架构下运行特权指令的时候如果权限不足会自动陷入权限更高的 Ring 中。所以当 GuestOS 执行特权指令的时候会陷入 Ring0，此时由 VMM 接管并模拟特权指令的执行，这就叫陷入模拟。</p>



<p class="wp-block-paragraph">不幸的是整个过程没有看起来那么简单。究其根本是因为虚拟机中的软件并不是为了虚拟化而编写的。</p>



<p class="wp-block-paragraph">有的指令在非 Ring0 下运行会返回一个包含当前 Ring 值的返回值，GuestOS 会去读取这个值，一旦发现自己没有运行在 Ring0 下就会出现错误。这也就导致了这类指令的调用无法被 VMM 检测到，自然也就无法模拟了。</p>



<p class="wp-block-paragraph">另一个问题是操作系统在编写的时候并没有支持操作系统级的上下文切换，所以一些上下文可能会在很隐蔽的角落。当 VMM 切换上下文的时候这些信息就会丢失导致错误。</p>



<p class="wp-block-paragraph">并非只有这些问题，受限于篇幅问题就不再多说了，读者有兴趣可以自行查阅资料。</p>



<h2 class="wp-block-heading">纯软件解决方案</h2>



<p class="wp-block-paragraph">为了应对这些挑战，设计人员给出了两种软件层面的途径去开发 VMM，分别是半虚拟化（Paravirtualization）和二进制翻译（Binary Translation）。</p>



<h4 class="wp-block-heading">半虚拟化（Paravirtualization）</h4>



<p class="wp-block-paragraph">这种方法需要修改 GuestOS 的源代码使得其可以在特定的 VMM 下运行。比如敏感指令替换为 hypercall。hypercall 直译为超级调用，可以陷入到 VMM 中以便 VMM 去模拟指令的运行。</p>



<p class="wp-block-paragraph">这种方式的好处是基本没有性能损失。但是坏处也很明显，它只能用于开源的操作系统，比如 Linux。</p>



<h4 class="wp-block-heading">二进制翻译（Binary Translation）</h4>



<p class="wp-block-paragraph">这个方法是将 GuestOS 的二进制指令翻译为另一种类指令，通常是翻译为 vCPU 可以识别的指令。它的特殊之处在于大多数情况下我们都是将源代码或者 IR（Intermediate Representation） 翻译为二进制代码，但是二进制翻译是将二进制代码翻译为另一类代码。按照翻译的时机分类又分为静态翻译和动态翻译。</p>



<h5 class="wp-block-heading">静态翻译（Static Binary Translation）</h5>



<p class="wp-block-paragraph">即在运行 GuestOS 前一次性地将全部的代码翻译为目标指令。这样做可以最大限度地提高性能，但是这个方法实际上并不可行。</p>



<p class="wp-block-paragraph">最大的难题是冯·诺依曼体系结构下指令和数据存储在一个存储器上，并未区分指令存储器和数据存储器。也就是说对于一堆静态的二进制数据，我们无法确定它到底是代码还是数据。这也就导致静态翻译可能错误地将数据翻译为代码从而导致错误。</p>



<p class="wp-block-paragraph">还有一个问题是有些程序会在运行时修改自己，而静态翻译是一次性的，这也会导致错误。</p>



<h5 class="wp-block-heading">动态翻译（Dynamic Binary Translation）</h5>



<p class="wp-block-paragraph">动态翻译就是在运行时以一种类似按需翻译的方式去翻译 GuestOS 的二进制指令。这可以很好地解决静态翻译带来的问题。</p>



<p class="wp-block-paragraph">因为只会翻译被执行的部分，所以不会错误地将数据翻译为二进制代码。同时由于翻译并不是一次性地工作，也可以解决程序修改自身所带来的问题。</p>



<p class="wp-block-paragraph">不过实际实现起来会有很多问题，比如何时启动翻译、翻译什么和翻译多少。这也是本系列的后续任务，将会简单地介绍一些实现动态翻译中遇到的问题和解决方法。本文在这一点不做过多讨论。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://software.intel.com/sites/default/files/m/d/4/1/d/8/An_Introduction_to_Virtualization.pdf" target="_blank" rel="noreferrer noopener">An Introduction to Virtualization</a></li><li><a href="http://rts.lab.asu.edu/web_438/project_final/CSE_598_Binary_Translation_Report.pdf" target="_blank" rel="noreferrer noopener">CSE 598 Binary Translation Report</a></li><li><a href="http://www.complang.tuwien.ac.at/schani/papers/bintrans.pdf" target="_blank" rel="noreferrer noopener">Dynamic Binary Translation</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/1891/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>虚拟化技术的术语</title>
		<link>https://www.addesp.com/archives/1877</link>
					<comments>https://www.addesp.com/archives/1877#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Fri, 02 Oct 2020 17:17:08 +0000</pubDate>
				<category><![CDATA[虚拟化技术]]></category>
		<category><![CDATA[虚拟化]]></category>
		<guid isPermaLink="false">https://www.addesp.com/?p=1877</guid>

					<description><![CDATA[介绍虚拟化技术中的一些常见术语。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">写在前面</h2>



<p class="wp-block-paragraph">本文章属于虚拟化技术系列文章，<strong><a href="https://www.addesp.com/shuoshuo/%e3%80%8c%e8%99%9a%e6%8b%9f%e5%8c%96%e6%8a%80%e6%9c%af%e3%80%8d%e7%b3%bb%e5%88%97%e5%bc%80%e5%9d%91" target="_blank" rel="noreferrer noopener">点击查看本系列的说明</a></strong>。</p>



<h2 class="wp-block-heading">宿主机（Host Machine）</h2>



<p class="wp-block-paragraph">宿主机是运行虚拟机的物理机，是真实地存在于物理世界的机器。它包含如 CPU，内存和网卡等物理资源。</p>



<h2 class="wp-block-heading">虚拟机（Virtual Machine）</h2>



<p class="wp-block-paragraph">虚拟机是对物理机虚拟化后的结果，并由虚拟化软件运行和维护。</p>



<h2 class="wp-block-heading">客机操作系统（<strong>GuestOS</strong>: Guest Operating System）</h2>



<p class="wp-block-paragraph">指运行在虚拟机中的操作系统。</p>



<h2 class="wp-block-heading">虚拟机管理程序/虚拟机监视器（Hypervisor/VMM）</h2>



<p class="wp-block-paragraph">实际上就是管理虚拟机和实现虚拟化的程序。在比较老的资料里这两个名词可能是不同的概念，即 Hypervisor 是直接运行在硬件上的，而 VMM 是运行在软件上的，但貌似目前这两个名词已经差不多一样了，不需要去可以区分了。</p>



<h2 class="wp-block-heading">半虚拟化（Paravirtualization）</h2>



<p class="wp-block-paragraph">通过修改操作系统的源代码实现的虚拟化，比如将一些敏感指令（可能导致虚拟化出错的指令）修改为 hypercall 使 VMM 可以模拟这类执行的执行以避免错误。</p>



<h2 class="wp-block-heading">全虚拟化（Full virtualization）</h2>



<p class="wp-block-paragraph">即不修改操作系统的源代码就可以实现的虚拟化。</p>



<h2 class="wp-block-heading">虚拟 CPU（vCPU）</h2>



<p class="wp-block-paragraph">指 VMM 虚拟出来的供虚拟机使用的 CPU，并不存在于物理世界中。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://software.intel.com/sites/default/files/m/d/4/1/d/8/An_Introduction_to_Virtualization.pdf" target="_blank" rel="noreferrer noopener">An Introduction to Virtualization</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/1877/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>虚拟化技术的发展史</title>
		<link>https://www.addesp.com/archives/1869</link>
					<comments>https://www.addesp.com/archives/1869#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Thu, 01 Oct 2020 16:58:30 +0000</pubDate>
				<category><![CDATA[虚拟化技术]]></category>
		<category><![CDATA[虚拟化]]></category>
		<guid isPermaLink="false">https://www.addesp.com/?p=1869</guid>

					<description><![CDATA[在我们了解如今成熟稳定的虚拟化技术之前，有必要去了解一下它的发展史。因为虚拟化并不是一项全新的技术，而是基于之前的努力。]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">写在前面</h2>



<p class="wp-block-paragraph">本文章属于虚拟化技术系列文章，<strong><a href="https://www.addesp.com/shuoshuo/%e3%80%8c%e8%99%9a%e6%8b%9f%e5%8c%96%e6%8a%80%e6%9c%af%e3%80%8d%e7%b3%bb%e5%88%97%e5%bc%80%e5%9d%91" target="_blank" rel="noreferrer noopener">点击查看本系列的说明</a></strong>。</p>



<p class="wp-block-paragraph">在我们了解如今成熟稳定的虚拟化技术之前，有必要去了解一下它的发展史。因为虚拟化并不是一项全新的技术，而是基于之前的努力。</p>



<h2 class="wp-block-heading">1950年 &#8211; 1990年</h2>



<p class="wp-block-paragraph">虚拟存储器的概念可以追溯到 20 世纪 50 年代末，当时曼彻斯特大学的一个小组在 Atlas 系统（一种晶体管计算机）中引入了自动换页功能，其原理是将分页作为一种在内存层次结构之间存储和传输数据的方法。虽然这个原理之前就有，但Atlas是第一个将这一过程自动化，从而提供了第一个虚拟存储器的工作原型。</p>



<p class="wp-block-paragraph">虚拟机这个词可以追溯到20世纪60年代，最早的虚拟机系统来自 IBM。1967 年前后，IBM 推出了型号为 67 的 System/360，它是第一个带有虚拟存储器的系统。这个系统中有一个概念名为处理器虚拟化指令集，这个概念也在也在后续的型号中得到完善。起初这个系统被称为 CP-67，之后就演化成了虚拟机系统。虚拟机允许在一台处理机上运行多个操作系统。本质上来说虚拟机和硬件通过合作来启动多个操作系统，让它们可以受保护地访问完整的指令集。</p>



<p class="wp-block-paragraph">20 世纪 60 年代中期，IBM 还率先推出了 M44/44X 项目，探索新兴的分时概念。系统架构的核心是一组虚拟机，每个用户可以使用其中的一个。宿主机是 IBM 7044（简称 M44），每个虚拟机是 7044 的实验镜像（简称44X）。这项工作最终促成了虚拟机/<a href="https://baike.baidu.com/item/%E5%88%86%E6%97%B6%E7%B3%BB%E7%BB%9F" target="_blank" rel="noreferrer noopener">分时系统</a>，包括 IBM 著名的 VM/370。</p>



<p class="wp-block-paragraph">硬件虚拟化的概念也是在这个时期出现的，VMM 可以在一个隔离和保护的环境中运行虚拟机。因为 VMM 对运行在虚拟机中的软件来说是透明的，软件认为它独占控制权。随着时间的推移，这一概念得到了完善，最终 VMM 只会消耗较少的性能和资源。</p>



<p class="wp-block-paragraph">20 世纪 70 年代中期，虚拟化技术已经在各个操作系统被用户所接受。在这几十年中，虚拟化技术解决了许多重要问题，例如应用还在大规模操作系统中虚拟存储器使得应用程序的编程变得简单，因为程序员不需要像以前那么关心内存不足的问题。</p>



<p class="wp-block-paragraph">虚拟出来资源是很便宜的，但是真实的物理资源却很贵，虚拟资源可以让我们按需分配这些昂贵的物理资源以获取最大的利益。比如现在厂商可以将多余的算力虚拟化成一个个的云服务器出售给客户。</p>



<p class="wp-block-paragraph">虽然在 20 世纪 60 年代和 70 年代，硬件级虚拟机在研究和商业市场上都很流行，但在 20 世纪 80 年代和 90 年代，它们基本上消失了。因为低成本的微型计算机和 PC 进入市场导致了虚拟化的需求在总体上有所下降。</p>



<p class="wp-block-paragraph">顺便一提，另一种类型的虚拟机在历史上仍有一席之地，典型的代表就是 <a href="https://baike.baidu.com/item/JVM" target="_blank" rel="noreferrer noopener">JVM</a> 和 微软的 <a href="https://baike.baidu.com/item/%E5%85%AC%E5%85%B1%E8%AF%AD%E8%A8%80%E8%BF%90%E8%A1%8C%E5%BA%93/2882128" target="_blank" rel="noreferrer noopener">CLR</a>。这一类型的虚拟机不是本文所要介绍的虚拟机，它们并不虚拟化出一个硬件平台，而是为编程语言提供可移植性。所以请不要混淆概念。</p>



<figure class="wp-block-image size-large is-resized is-style-default"><img fetchpriority="high" decoding="async" src="https://www.addesp.com/wp-content/uploads/2020/10/2.webp" alt="" class="wp-image-1887" width="466" height="334"/><figcaption>Runtime Virtual Machines</figcaption></figure>



<h2 class="wp-block-heading">虚拟化的重新兴起</h2>



<p class="wp-block-paragraph">20 世纪 90 年代，企业部署的服务器数量越来越多，但是服务器资源的利用效率却越来越低。</p>



<p class="wp-block-paragraph">一个服务器仅仅部署一个应用会大量浪费服务器的硬件资源。一个服务器部署多个应用则会遇到更为严重的问题，比如其中一个应用崩溃了可能会带着整个服务器崩溃，那么这台服务器上所有的应用都会停止。又比如某个应用更新后需要重启服务器，但是这台服务器上还有别的应用，所以其它应用也被迫重启。</p>



<p class="wp-block-paragraph">服务器数量的激增带来了部署、更新和支持方面的挑战，以及安全和灾难恢复方面的问题。</p>



<p class="wp-block-paragraph">虚拟化技术很好地解决这一问题。可以在一台宿主机上虚拟出多个虚拟机，每个虚拟机仅部署一个应用。由于每个虚拟机时互相隔离的，所以崩溃一个其它的依然可以正常运行，上面的问题也就迎刃而解了。</p>



<p class="wp-block-paragraph">虽然虚拟化技术重新兴起，但是开发用于虚拟化的操作系统和软件是一件十分复杂的事情。<a href="https://baike.baidu.com/item/Intel%20VT/2091588" target="_blank" rel="noreferrer noopener">Intel VT</a> 的出现消除或大大减少了其中的一些复杂因素。Intel 开始与 VMM 的开发者合作，在 Intel 处理器和芯片组中实现硬件辅助虚拟化，并推动相关规范的制定以促进虚拟化在未来的发展。</p>



<h2 class="wp-block-heading">参考资料</h2>



<ul class="wp-block-list"><li><a href="https://software.intel.com/sites/default/files/m/d/4/1/d/8/An_Introduction_to_Virtualization.pdf" target="_blank" rel="noreferrer noopener">An Introduction to Virtualization</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/1869/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
