3

当我说内存映射寄存器的地址始终是物理地址时,我是否正确?

如果是,那么 MMU 如何处理这些地址并决定不为它们进行虚拟到物理的转换?

4

2 回答 2

3

MMU 不做任何决定。它只是根据操作系统告知的内容映射地址:虚拟地址到物理地址,和/或如果特定物理地址的映射被标记为“无效”或与操作系统的操作不一致,则中断应用程序当前机器指令(例如,对于指令获取、“不可执行”、对于存储、“只读”等)。

操作系统建立了一组规则和约定,以确保应用程序不能为彼此创建 greif。如果此操作系统可以写入内存映射 I/O 设备,则操作系统将设置 MMU 映射(例如页面映射寄存器)以允许它;否则它不会设置 MMU 页面映射到 I/O 设备。

对于大多数通用操作系统来说,允许任意程序写入 I/O 寄存器是“引起悲伤”的定义,它们根本不会设置这样的映射。这就是 Windows 从用户进程的角度采取行动的方式。

对于特殊用途的操作系统,让单独的进程共享 I/O 页面可能很好,特别是如果运行的进程是受信任的(例如,操作系统的一部分或通过了一些声称质量好的认证机构)。然后,多个受信任的进程可以安全方便地共享内存映射 I/O 设备。即使是不受信任的进程也可以在这样的操作系统上运行;它根本不允许他们访问 I/O。

早在 1972 年,我就构建了一个独特的虚拟内存 16 位小型机。MMU 有两种页面映射:虚拟页面到物理页面的映射(如您所料),以及页面到单个32 字节 I/O 设备的映射。这意味着操作系统可以安全地处理任何设备(对操作系统功能不重要)的 任何进程。

特别是,这意味着每个 I/O 驱动程序都有自己的地址空间。如果它搞砸了,没问题。您可以在运行操作系统时调试设备驱动程序而不必担心。(Windows 多年来一直遭受 I/O 驱动程序损坏破坏 Windows;我仍然认为,但他们的质量控制“可信度检查”现在非常强大)。

唉,这不是商业上的成功。我被迫从事软件谋生:-{

于 2014-12-06T23:54:02.833 回答
0

你是对的。

处理器内存映射中的所有寄存器和/或内存位置都是物理地址。

虚拟到物理的转换由 MMU 完成,并且只发生在可以从中执行代码的连续内存块中。即 RAM 或内部闪存。当访问内存映射的其他部分时,不会发生虚拟到物理的转换,因为它们不与 MMU 交互。

于 2014-12-06T23:53:24.110 回答