0

我正在尝试编写一个非常薄的管理程序,它具有以下限制:

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

我搜索了互联网,但几乎没有发现任何关于这个特定问题的信息,因为我想尽可能少地保留开销(当前的管理程序实现不适合我的需要)。

4

2 回答 2

2

您正在寻找的东西已经存在于硬件中!

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

AMD 称其为 IOMMU[2],英特尔称其为 VT-d(请 google:“intel vt-d”,我还不能发布两个以上的链接)。

[1] http://en.wikipedia.org/wiki/IOMMU
[2] http://developer.amd.com/documentation/articles/pages/892006101.aspx

于 2011-11-24T23:19:59.610 回答
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 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 键盘)。

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

您可能会遇到更多的细节和事情(例如,x86 处理器在第一次通电时以 16 位模式开始),但是如果您对此处列出的那些做一些功课,那么希望您会在更好地提出后续问题。

于 2012-03-29T00:49:41.767 回答