我正在尝试编写一个非常薄的系统管理程序,它将具有以下限制:
我搜索了Internet,但是在这个特定的问题上几乎没有发现任何东西,因为我希望尽可能少的开销(当前的hypervisor实现不符合我的需要)。
发布于 2012-03-29 00:49:41
以下是一些建议/提示,这些建议/提示一定有些不完整,因为开发从头开始的管理程序是一项涉及到的任务。
让你的管理程序“多引导兼容”在一开始。这将使它能够作为一个典型条目驻留在引导加载程序配置文件中,例如/boot/grub/menu.lst或/boot/grub/grub.cfg。
您希望在内存顶部留出100 6GB,例如,从5.9GB到6GB。既然您提到了Windows,我假设您对x86体系结构感兴趣。x86的悠久历史意味着最初的几兆字节充满了各种遗留设备的复杂性。网上有很多关于640 K到1MB之间的“漏洞”的资料(网上有很多详细的信息)。较老的ISA设备(其中许多仍在“超级I/O芯片”的现代系统中生存)仅限于执行DMA,仅限于物理内存的前16 MB。如果您试图在Windows或Linux及其与最初的几MB内存之间的关系之间取得联系,那么您将有更多的复杂性需要解决。等你买了靴子以后再说吧。
当物理地址接近4GB (2^32,因此基本32位架构上的物理内存限制)时,事情又变得复杂起来,因为许多设备被映射到这个区域。例如(引用另一个答案),Intel通过其VT技术提供的IOMMU倾向于将其配置寄存器映射到以0xfedNNNN开头的物理地址。
对于具有多个处理器的系统来说,这是双重的。我建议您从单处理器系统开始,在BIOS中禁用其他处理器,或者至少手动配置您的客户操作系统,使其不启用其他处理器(例如,对于Linux,在内核命令行中包括'nosmp‘--例如在/boot/grub/menu.lst中)。
接下来,了解"e820“地图。同样,网络上也有大量的内容,但最好的出发点也许是启动Linux系统,并查看输出“dmesg”的顶部。这就是BIOS如何与操作系统通信的--物理内存空间的哪些部分是“预留”给设备或其他特定平台的BIOS/固件使用的(例如,在只有USB I/O端口的系统上模拟PS/2键盘)。
管理程序对客户操作系统“隐藏”其100 map的一种方法是向系统的e820映射添加一个条目。一种快速而肮脏的方法是使用Linux内核命令行选项"mem=“或boot.ini / bcdedit标志"/maxmem”。
有更多的细节和事情,你可能会遇到(例如,x86处理器开始在16位模式时,第一次供电),但如果你做一些家庭作业在这里列出的,那么希望你将有一个更好的位置,以问后续问题。
https://stackoverflow.com/questions/7064639
复制相似问题