2011-08-15 69 views
0

我想写一个非常瘦系统管理程序,将有以下限制:OS内存隔离

  • 只运行一个操作系统在同一时间(即没有操作系统的并发性,没有硬件共享,没办法切换到另一个操作系统)
  • 它应该能够只有来隔离RAM的某些部分(做一些内存翻译在操作系统后面 - 比方说,我有6GB的RAM,我想Linux/Win不使用第一个100MB,看到只有5.9MB,并使用它们而不知道后面是什么)

我搜索了互联网,但在这个特定问题上几乎没有发现,因为我想保持尽可能少的开销(目前的虚拟机管理程序实现不符合我的需求)。

回答

1

这里有几个建议/提示,这必然是有些不完整,作为展开一个从刮擦管理程序是一个复杂的任务。

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

您想要在内存的top处预留100MB,例如从5.9GB到6GB。既然你提到Windows,我假设你对x86架构感兴趣。 x86的悠久历史意味着最初的几兆字节充满了各种传统设备的复杂性。网络上有大量关于640K和1MB之间的“漏洞”的资料(网络上的大量信息详细说明了这一点)。旧的ISA设备(其中许多仍然存在于“超级I/O芯片”的现代系统中)仅限于对第一个16 MB的物理内存执行DMA。如果您尝试在Windows或Linux之间以及它们与前几MB RAM之间的关系,那么您将面临更复杂的问题。除此之外,一旦你有了启动的东西。由于物理地址接近4GB(2^32,因此物理内存限制在基本的32位架构上),事情变得很复杂,因为很多设备都被内存映射到这个区域。例如(参考其他答案),英特尔提供其VT-d技术的IOMMU倾向于将其配置寄存器映射到以0xfedNNNNN开头的物理地址。

这对于具有多个处理器的系统是双重的。我建议你从一个单处理器系统开始,从BIOS中禁用其他处理器,或者至少手动配置你的客户操作系统,不要启用其他处理器(例如,对于Linux,在内核命令行中包括'nosmp' - 例如,在你的/boot/grub/menu.lst)。

接下来,了解“e820”地图。网上还有大量资料,但也许最好的开始是启动一个Linux系统,并且看起来接近输出“dmesg”的顶部。这就是BIOS如何与操作系统进行通信,以便为设备或其他平台特定的BIOS /固件使用“保留”哪些物理内存空间的某些部分(例如,模拟仅具有USB I/O端口的系统上的PS/2键盘)。

您的虚拟机管理程序从guest虚拟机操作系统“隐藏”其100MB的一种方式是向系统的e820映射添加条目。一种快速而肮脏的方式是使用Linux内核命令行选项“mem =”或Windows boot.ini/bcdedit标志“/ maxmem”。

有很多更多的细节和你可能遇到的事情(例如,x86处理器在第一次通电时以16位模式开始),但如果你在这里列出的那些做一些小作业,那么希望你将能够更好地询问后续问题。