Operating system 操作系统内存隔离

Operating system 操作系统内存隔离,operating-system,virtualization,hypervisor,Operating System,Virtualization,Hypervisor,我正在尝试编写一个非常精简的虚拟机监控程序,它将具有以下限制: 一次只运行一个操作系统(即无操作系统并发、无硬件共享、无法切换到其他操作系统) 它应该只能够隔离RAM的某些部分(在操作系统后面做一些内存转换——比如说我有6GB的RAM,我希望Linux/Win不要使用前100MB,只看到5.9MB,在不知道后面是什么的情况下使用它们) 我在互联网上搜索了一下,但在这个具体问题上几乎没有发现任何东西,因为我希望尽可能减少开销(当前的虚拟机监控程序实现不符合我的需要)。您所寻找的已经存在,在硬件

我正在尝试编写一个非常精简的虚拟机监控程序,它将具有以下限制:

  • 一次只运行一个操作系统(即无操作系统并发、无硬件共享、无法切换到其他操作系统)
  • 它应该只能够隔离RAM的某些部分(在操作系统后面做一些内存转换——比如说我有6GB的RAM,我希望Linux/Win不要使用前100MB,只看到5.9MB,在不知道后面是什么的情况下使用它们)

我在互联网上搜索了一下,但在这个具体问题上几乎没有发现任何东西,因为我希望尽可能减少开销(当前的虚拟机监控程序实现不符合我的需要)。

您所寻找的已经存在,在硬件中

它叫Iomu[1]。基本上,就像页表一样,在执行的指令和实际的物理硬件之间添加一个转换层

AMD称之为IOMMU[2],英特尔称之为VT-d(请谷歌搜索:“英特尔VT-d”,我现在只能发布两个链接)

[1]

[2]

您要寻找的东西已经存在,在硬件中

它叫Iomu[1]。基本上,就像页表一样,在执行的指令和实际的物理硬件之间添加一个转换层

AMD称之为IOMMU[2],英特尔称之为VT-d(请谷歌搜索:“英特尔VT-d”,我现在只能发布两个链接)

[1]

[2]

以下是一些建议/提示,这些建议/提示一定有些不完整,因为从头开始开发虚拟机监控程序是一项复杂的任务

首先让您的虚拟机监控程序“符合多引导”。这将使它能够作为引导加载程序配置文件中的典型条目驻留,例如/boot/grub/menu.lst或/boot/grub/grub.cfg

您希望在内存顶部留出100MB,例如从5.9GB到6GB。既然您提到了Windows,我想您一定对x86体系结构感兴趣。x86的悠久历史意味着最初的几兆字节充满了各种遗留设备的复杂性。网络上有大量关于640K和1MB之间的“洞”的资料(网络上有大量详细信息)。较旧的ISA设备(其中许多仍然存在于现代系统的“超级I/O芯片”中)仅限于对前16MB的物理内存执行DMA。如果您试图在Windows或Linux及其与前几MB RAM的关系之间进行切换,您将面临更大的复杂性。留着以后用,一旦你有了能穿靴子的东西

随着物理地址接近4GB(2^32,因此基本32位体系结构的物理内存限制),事情又变得复杂了,因为许多设备的内存映射到这个区域。例如(参考另一个答案),Intel为其VT-d技术提供的IOMMU倾向于将其配置寄存器映射到以0xFEDNNN开头的物理地址

对于具有多个处理器的系统来说,这是双重事实。我建议您从单处理器系统开始,从BIOS中禁用其他处理器,或者至少手动配置来宾操作系统以不启用其他处理器(例如,对于Linux,包括“nosmp”) 在内核命令行上——例如,在/boot/grub/menu.lst中)

接下来,了解“e820”地图。同样,web上有大量的资料,但也许最好的开始是启动Linux系统,并查看输出“dmesg”的顶部。这是BIOS与操作系统通信的方式,其中物理内存空间的哪些部分“保留”给设备或其他特定于平台的BIOS/固件使用(例如,在只有USB I/O端口的系统上模拟PS/2键盘)

hypervisor向来宾操作系统“隐藏”其100MB的一种方法是在系统的e820映射中添加一个条目。一种快速而肮脏的启动方式是使用Linux内核命令行选项“mem=”或Windows boot.ini/bcdedit标志“/maxmem”


您可能会遇到更多的细节和问题(例如,x86处理器在首次通电时以16位模式启动),但如果您对此处列出的问题做一点准备,则希望您能够更好地提出后续问题。

这里有一些建议/提示,这必然有些不完整,因为从头开始开发虚拟机监控程序是一项复杂的任务

首先让您的虚拟机监控程序“符合多引导”。这将使它能够作为引导加载程序配置文件中的典型条目驻留,例如/boot/grub/menu.lst或/boot/grub/grub.cfg

您希望在内存顶部留出100MB,例如从5.9GB到6GB。既然您提到了Windows,我想您一定对x86体系结构感兴趣。x86的悠久历史意味着最初的几兆字节充满了各种遗留设备的复杂性。网络上有大量关于640K和1MB之间的“洞”的资料(网络上有大量详细信息)。较旧的ISA设备(其中许多仍然存在于现代系统的“超级I/O芯片”中)仅限于对前16MB的物理内存执行DMA。如果您试图在Windows或Linux及其与前几MB RAM的关系之间进行切换,您将面临更大的复杂性。留着以后用,一旦你有了能穿靴子的东西

随着物理地址接近4GB(2^32,因此基本32位体系结构的物理内存限制),事情又变得复杂了,因为许多设备的内存映射到这个区域。例如(参考另一个答案),Intel为其VT-d技术提供的IOMMU倾向于将其配置寄存器映射到以0xFEDNNN开头的物理地址

对于具有多个处理器的系统来说,这是双重事实。我建议您从单处理器系统开始,从BIOS中禁用其他处理器,或者至少手动配置来宾操作系统