5

我正在学习计算机体系结构,并遇到了一种说法:“完全可以在没有虚拟内存的情况下运行,只需物理内存(事实上,大多数嵌入式系统都以这种方式运行)”。

这是真的吗?如果是,那么我想知道如何?

谢谢。

4

4 回答 4

7

不使用虚拟内存的嵌入式系统通常作为单个进程或线程运行,或者支持多线程而不是多处理任务模型。也就是说,所有线程/任务共享一个公共地址空间,但具有单独的堆栈(尽管也在单个地址空间中)。

在具有 MMU 并支持虚拟内存的处理器上,这只需通过不配置 MMU 或至少具有具有一对一映射的静态 MMU 配置来完成,以便物理地址和 MMU 地址相同,或者至少这样有一个单一的虚拟地址空间。

PIC、AVR、ARM7、ARM Cortex-M、Zilog Z8 等嵌入式系统中使用的许多中低端架构缺少 MMU,并且通常具有比典型 ARM9/11/Cortex-A 小得多的内存资源或基于 x86 的系统。

对于无 MMU 系统中的多线程支持,您通常会使用实时操作系统(RTOS)。大多数 RTOS,除了一些值得注意的例外,都是带有 IPC 和同步原语的简单任务调度程序,并且不使用或支持 MMU。QNX 和 VxWorks 等高端 RTOS 支持 MMU,尽管在 VxWorks 中它是可选的。

uCLinux 是针对具有足够内存资源来运行 Linux 但缺少诸如 ARM7 和 Cortex-M 之类的 MMU 的处理器的 GPOS。尽管可以说,没有 MMU 的 Linux 错过了使用 Linux 的主要优势之一,同时缺乏硬实时性能,并且需要大内存;一个典型的 RTOS 内核需要(远)少于 10kBytes 的代码。

于 2013-10-13T07:45:00.160 回答
4

一个“完全可以在没有虚拟内存的情况下运行,只需要物理内存”的世界。

嘿,我是在那个世界长大的!

虚拟内存的概念从 50 年代就已经存在,但个人电脑直到 90 年代初才支持虚拟内存。过去,PC 是单一进程——当您完成文字处理应用程序时,您会退出它并加载电子表格应用程序。

例如,控制洗衣机或汽车发动机的现代嵌入式系统是一个单进程设备 - 虚拟内存和提供它的 MMU 在瓦特、硅片和开发工作方面是不必要的成本。

也就是说,完全有可能在单个地址空间中运行多个应用程序。您可以确保您的编译器吐出可重定位的代码(即所有到本地函数的跳转都是相对的,就像对全局数据的引用一样)在这种情况下,每个应用程序都可以在操作系统认为合适的地方加载并正常运行(即 Linux 共享对象)或者您可以在文件中表示应用程序,以便它们可以在加载时重新定位。即,当加载到任意基地址时,操作系统会在加载期间更正地址引用(即 Windows DLL 和 EXE)

于 2013-10-12T23:44:57.577 回答
2

虚拟内存只是一种呈现物理内存的方式,让每个进程都有独立的内存空间。这种间接通过称为MMU(内存管理单元)的特殊硬件单元成为可能。

早期的计算机系统只是直接使用物理内存。这导致了一个用户可以访问同一系统上所有其他用户的进程内存的安全问题。虚拟内存通过将每个进程的内存空间分开来解决这个问题。

于 2013-10-12T16:19:47.377 回答
1

在虚拟内存之前,如果您对在同一地址空间中运行不同的应用程序感兴趣。然后在任务切换期间,您只需将一个应用程序数据从一个地址空间复制到另一个地址空间进行存储,将另一个任务从其存储空间复制到该地址空间并让它运行一段时间。为什么你会希望应用程序在没有虚拟内存系统的系统上运行在同一个地方,这是无法理解的,但如果你真的觉得你必须这样做的话。很明显,操作系统早于虚拟内存系统,因此研究这些操作系统以了解它们的工作原理是一件简单的事情。

这让我想起了一个问题,当时有人问我们如何处理 x86 世界中的 64K 边界。答案是我们通常没有制作那么大的程序或需要那么大的数据。所以这不是一个真正的问题。当然,今天有一些应用程序处理无法在一个空间(实际上)处理的 TB 级数据,我们处理这些数据,但大部分时间都花在了可用的内存空间中。我们当时和之前都做过,我们不担心不存在的虚拟内存及其附带的功能。

于 2013-10-12T18:36:57.123 回答