【问题标题】:Virtual memory and memory management unit虚拟内存和内存管理单元
【发布时间】:2023-03-15 18:49:01
【问题描述】:

为什么我们需要内存管理单元?

似乎内存管理单元的唯一任务是将虚拟地址转换为物理地址。这不能在软件中完成吗?为什么我们需要另一个硬件设备呢?

【问题讨论】:

    标签: memory-management paging virtual-memory virtual-address-space


    【解决方案1】:

    MMU (Memory Management Unit) 是大多数硬件平台上可用的硬件组件,可将虚拟地址转换为物理地址。这种翻译带来以下好处:

    • 交换:您的系统可以处理比物理可用内存更多的内存。例如,在 32 位架构上,系统“看到”4 GB 内存,而不管可用的物理内存量如何。如果您使用的内存比实际可用的多,内存页将换出到交换磁盘上。
    • 内存保护:MMU 通过阻止用户模式任务访问其他任务拥有的内存部分来强制执行内存保护。
    • 重定位:每个任务都可以使用特定偏移处的地址(例如,用于变量),而不管在运行时分配的实际地址如何。

    可以部分实现软件翻译机制。例如,对于重定位,您可以查看gcc's fpic 的实现。但是,软件机制不能提供内存保护(这反过来又会影响系统的安全性和可靠性)。

    【讨论】:

    • -fpic 与虚拟内存无关。在没有虚拟地址的环境中,它的工作方式完全相同。 (但它会在更多时候有用。虚拟寻址让可执行代码每次都加载到相同的虚拟地址,而不管还运行什么。)
    • -fpic 可以在没有 MMU 的 Linux 系统中进行某种重定位。
    • 它在普通系统上用于制作共享对象(库),因为它们可以在任何地址加载。对于非库可执行文件,它是虚拟内存解决的重定位问题的替代解决方案。不过,这并不意味着它是 VM 的部分实现,只是当您没有 VM 时遇到的问题的不同解决方案。它仍然不允许代码移动到不同的物理地址(例如,在被逐出并稍后分页后),因为寄存器中可能有一些地址指向旧页面。
    • IDK,我只是觉得强调是错误的。这是一个微妙的次要问题,当有几个重大问题时(例如,内存保护为您提供安全性(内核与用户,以及多个用户,稳定性(一个有缺陷的程序不会使系统崩溃))
    • 我不太明白这个答案。它似乎只是提供了虚拟内存的好处。但是,问题是为什么 MMU 对虚拟内存管理是必要的,而不是为什么虚拟内存是有益的。如果您查看 Patterson & Hennessy Computer Organization and Design 中提供的对虚拟内存的描述,他们在整个讨论中都没有提到 MMU。它被描述为操作系统在内存中维护页表。在整本书中,我唯一能找到的有关 MMU 的参考资料是在与 GPU 相关的附录中。
    【解决方案2】:

    CPU 使用 MMU 组件的原因是为了使逻辑到物理地址的转换对执行进程透明。在软件中执行此操作需要停止以处理进程的每次内存访问。另外,如果记忆翻译是由软件完成的,那么您会遇到先有鸡还是先有蛋的问题,那么该软件的记忆翻译由谁来完成。

    【讨论】:

    • 操作系统是否决定虚拟到物理地址的映射,然后依赖 MMU 执行后续转换,或者它是如何工作的?既然每个进程都需要自己的页表,那么 MMU 怎么知道当前运行的是哪个进程呢?在上下文切换期间操作系统是否向 MMU 发出信号?确保一个进程的物理地址不会与另一个进程的物理地址冲突是谁的工作?
    • 操作系统为进程创建逻辑地址空间。操作系统必须维护将逻辑进程页面映射到物理页面的页表。映射会随着时间而改变。在某些系统中,进程可以共享页表或部分页表,以维护公共页映射。所有进程的系统地址转换都是相同的,因此它们可以共享。通常,有一组特权硬件寄存器定义当前页表。这些寄存器在上下文切换期间由操作系统更改。操作系统必须确保进程不会互相踩踏。
    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2021-11-07
    相关资源
    最近更新 更多