© 2016-2023 Conmajia × A. Bryan
Updated 11th March, 2023
Initiated 27th June, 2016
摘要 本文改编自 How to Create Your Own Virtual Machine 系列文章,承蒙原作者 Alan L. Bryan 许可. 文中提及的商标、名称等所有权归于其各自权利所有者.
简介
亲爱的读者朋友,你正在阅读的这个系列文章将从零开始,带你设计并实现一个完整可运行的虚拟机. 本文是这个系列的第一篇文章. 我们将使用 C# 语言,基于 .NET Framework 2.0 实现此虚拟机. 你需要具备最基本的 .NET 开发知识. 或者说,你应当至少具备使用 Visual Studio 开发环境进行简单 C# 编程的能力.
在开始设计前,我们先来了解一下虚拟机的相关知识. 所谓虚拟机即是一种“虚拟”硬件环境的中间件. 它是高度隔离的软件容器,可以运行自己的操作系统和应用程序. 从运行其上的应用程序角度看去,这就是一台“物理的”计算机:包含自己的处理器,甚至具有一台真正计算机应有的 RAM、磁盘或者网络接口卡(NIC)等硬件——尽管这些都是基于软件,于宿主计算机上实现的. 这里提到的宿主计算机指的是运行虚拟机的实体计算机.
计算机操作系统无法区分虚拟机与实体机,应用程序和网络中的其他计算机同样对此无能为力. 即使是虚拟机本身也认为自己是一台“真正的”计算机. 由于虚拟机完全由软件实现,因此可以做到在相当程度上不依赖于具体硬件. 这是虚拟机独特的优势.
虚拟机的特点
一般而言,虚拟机具备以下关键特点,也是设计虚拟机时的设计方向.
- 兼容性:虚拟机可以根据需要,兼容采用不同型号处理器的宿主计算机
- 隔离性:虚拟机运行于沙盒模式,可以有效隔离内部程序和宿主计算机
- 独立性:虚拟机运行于应用层,除驱动部分外不依赖于底层硬件
而在我们的设计中,虚拟机——我们命名为 SunnyApril ——被设计为由中央处理器、显示缓存组成的无外设结构. 这也许和你想象中的类似 VMWare、Parallel Desktop、Virtual PC 之类商用虚拟机不同,但其基本原理是别无二致的——除了商用版本会用到宿主处理器的高级特性,或者提供丰富的虚拟外设,并且不需要自行汇编可执行文件.
设计中央处理器
我们将 SA 设计成一个 16 位的虚拟机,这意味着它的 CPU 核心位宽将是 16 比特的. 如此一来,SA 可以支持的内存寻址空间为 0x0000
-0xFFFF
共 64 KB.
通用寄存器
寄存器是计算机结构中一个重要的概念和组件. 一类是特殊功能寄存器,通过设置寄存器内容改变处理器运行方式,这在单片微处理器中十分常见. 另一类被称为通用寄存器(general purpose registers,GPR),用于数据交换和计算结果缓存.
不同于消费者熟知的 CPU 片内缓存,通用寄存器是位于 CPU 核心内的第一级原生缓存,其速度一般是门电路级,读写周期在 1 至 2 个时钟周期内. 例如
若以 Intel 处理器常见的 L1、L2 等高速缓存作为对照,通用寄存器以其运行速度和优先级而言,可以被称为 L0 级,甚至是 L-1 级缓存,其速度和优先级远高于 L1 级. 一方面如此高速的存储单元造价极高,另一方面过多的寄存器会增加处理器核心和内部通信总线复杂度,通常情况下计算机 CPU 中不会设计太多通用寄存器. 以 Intel i9-12900K 处理器为例,其 L1、L2、L3 级缓存分别为 32 KB、6 MB、24 MB,而该款 CPU 的寄存器数量则仅为 28 个,容量仅 288 字节. 当然,这里指的寄存器是通用寄存器,不包括用于配置处理器功能的专用寄存器.
作为演示,我们为 SA 设计了 5 个寄存器:A、B、D、X、Y. 其中,A、B 寄存器是 8 位寄存器,可存储数字范围 0x00
-0xFF