我想写一个非常瘦系统管理程序,将有以下限制:OS内存隔离
- 只运行一个操作系统在同一时间(即没有操作系统的并发性,没有硬件共享,没办法切换到另一个操作系统)
- 它应该能够只有来隔离RAM的某些部分(做一些内存翻译在操作系统后面 - 比方说,我有6GB的RAM,我想Linux/Win不使用第一个100MB,看到只有5.9MB,并使用它们而不知道后面是什么)
我搜索了互联网,但在这个特定问题上几乎没有发现,因为我想保持尽可能少的开销(目前的虚拟机管理程序实现不符合我的需求)。
我想写一个非常瘦系统管理程序,将有以下限制:OS内存隔离
我搜索了互联网,但在这个特定问题上几乎没有发现,因为我想保持尽可能少的开销(目前的虚拟机管理程序实现不符合我的需求)。
这里有几个建议/提示,这必然是有些不完整,作为展开一个从刮擦管理程序是一个复杂的任务。
首先让您的管理程序“多引导符合”。这将使其能够作为引导加载程序配置文件中的典型条目驻留,例如/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位模式开始),但如果你在这里列出的那些做一些小作业,那么希望你将能够更好地询问后续问题。
您正在寻找的硬件已经存在!
它被称为IOMMU [1]。基本上,像页表一样,在执行的指令和实际的物理硬件之间增加一个翻译层。英特尔称之为VT-d(请google:“intel vt-d”我现在不能发布两个以上的链接)。
[1] http://en.wikipedia.org/wiki/IOMMU
[2] http://developer.amd.com/documentation/articles/pages/892006101.aspx