我正在尝试编写一个非常薄的虚拟机管理程序,它具有以下限制:
我搜索了互联网,但发现这个具体问题几乎没有,因为我希望保持尽可能少的开销(当前的虚拟机管理程序实现不符合我的需要)。
答案 0 :(得分:2)
您正在寻找的东西已经存在,硬件!
它被称为IOMMU [1]。基本上,就像页表一样,在执行的指令和实际的物理硬件之间添加转换层。
AMD称之为IOMMU [2],英特尔称之为VT-d(请谷歌:“intel vt-d”我还不能发布超过两个链接)。 [1] http://en.wikipedia.org/wiki/IOMMU
[2] http://developer.amd.com/documentation/articles/pages/892006101.aspx
答案 1 :(得分:1)
以下是一些建议/提示,这些建议/提示必然有些不完整,因为开发一个从头开始的虚拟机管理程序是一项涉及的任务。
首先让您的虚拟机管理程序“符合多重启动”。这将使其作为典型条目驻留在引导加载程序配置文件中,例如/boot/grub/menu.lst或/boot/grub/grub.cfg。
您希望在内存的顶部处留出100MB,例如从5.9GB到6GB。既然你提到了Windows,我假设你对x86架构很感兴趣。 x86的悠久历史意味着前几兆字节充满了各种传统设备的复杂性。网上有大量关于640K和1MB之间“漏洞”的材料(详细介绍了网上的大量信息)。较旧的ISA设备(其中许多仍然存在于“超级I / O芯片”的现代系统中)仅限于对前16 MB的物理内存执行DMA。如果你试图介入Windows或Linux及其与前几MB内存的关系,那么你将面临更大的复杂性。保存一下,等待以后,一旦你有东西启动。
由于物理地址接近4GB(2 ^ 32,因此是基本32位架构的物理内存限制),事情再次变得复杂,因为许多设备被内存映射到此区域。例如(参考其他答案),英特尔提供的VT-d技术的IOMMU往往将其配置寄存器映射到以0xfedNNNNN开头的物理地址。
对于具有多个处理器的系统,这是双重的。我建议你从单处理器系统开始,从BIOS内禁用其他处理器,或者至少手动配置你的客户操作系统不启用其他处理器(例如,对于Linux,包括'nosmp' 在内核命令行上 - 例如,在/boot/grub/menu.lst中。)
接下来,了解“e820”地图。网络上还有很多材料,但也许最好的起点是启动一个Linux系统,看看输出'dmesg'的顶部附近。这就是BIOS与OS通信的方式,物理内存空间的哪些部分被“保留”用于设备或其他特定于平台的BIOS /固件(例如,在仅具有USB I / O端口的系统上模拟PS / 2键盘) )。
管理程序从客户操作系统“隐藏”其100MB的一种方法是在系统的e820地图中添加一个条目。快速而肮脏的方法是使用Linux内核命令行选项“mem =”或Windows boot.ini / bcdedit标志“/ maxmem”。
有很多细节和你可能会遇到的事情(例如,x86处理器在第一次启动时以16位模式开始),但是如果你对这里列出的那些做了一些功课,那么希望你我会更好地提出后续问题。