9

据我了解,虚拟内存如下:

程序/应用程序/可执行文件驻留在存储设备中。存储设备访问比 RAM 慢得多。因此,程序从存储存储器复制到主存储器以供执行。由于计算机的主内存 (RAM) 有限,​​当所有 RAM 都被使用时(例如,如果同时打开许多程序或正在使用一个非常大的程序),启用虚拟内存的计算机会将数据交换到HDD 并根据需要返回内存,因此实​​际上增加了总系统内存。

据我所知,大多数嵌入式设备没有磁盘内存(如智能手机或汽车信息娱乐系统)。代码直接从闪存执行。RAM 主要用作暂存区(局部变量、返回地址等)。

那么为什么我们在嵌入式系统中需要虚拟内存呢?(例如 WinCE 和 QNX 支持虚拟内存)

4

5 回答 5

16

你的理解是完全错误的。您将虚拟内存与交换文件或页面文件混淆了。有些系统有虚拟内存,没有交换或页面文件,有些系统交换没有虚拟内存。

虚拟内存只是意味着一个进程拥有不同于物理映射的内存视图。除其他外,它允许进程拥有自己的虚拟地址空间。

存储设备访问比 RAM 慢得多。因此,程序从存储存储器复制到主存储器以供执行。由于计算机的主内存 (RAM) 有限,​​当所有 RAM 都被使用时(例如,如果同时打开许多程序或正在使用一个非常大的程序),启用虚拟内存的计算机会将数据交换到HDD 并根据需要返回内存,因此实​​际上增加了总系统内存。

那是交换(或分页)。除了大多数现代操作系统使用虚拟内存实现交换之外,它与虚拟内存无关。交换实际上存在虚拟内存之前。

我认为您可能对这些设备直接从闪存运行代码不正确。闪存的读取速度非常低,RAM 非常便宜。我敢打赌,您提到的大多数系统都不会直接从闪存运行代码,而是根据需要使用虚拟内存将代码错误地写入 RAM。

于 2013-01-03T04:56:29.693 回答
7

嵌入式系统,该术语本身具有广泛的应用。您可以将闪存程序空间以 kbytes 或更少为单位的小型微控制器称为嵌入式系统,ram 以位或字节(不足以为 kbytes)为单位。同样,在一个非常成熟的计算机主板上运行一个成熟的操作系统的 tivo(另一个例子用 xbox 替换 tivo)作为嵌入式系统。所以你需要对你的问题不那么含糊。虚拟内存与它的应用程序跨越这些边界无关。

上面有很多答案,David S 当然最好的是,虚拟内存只是意味着虚拟内存边界一侧的内存地址与该边界另一侧使用的物理地址不同。边界在哪里、如何、为什么等是不同的。

虚拟内存的一种流行用途,我可能认为主要用例是操作系统。一个好处是,例如,所有应用程序都可以针对相同的地址空间进行编译,所有应用程序都可以编译为从程序的角度来看,它们都从地址 0x8000 开始,并且就该程序在运行和访问它访问的内存时而言基于该地址的东西。硬件和操作系统的组合将程序正在使用的虚拟地址更改为物理地址。如果操作系统允许多任务处理,那么每个任务可能会认为它们位于相同的地址空间中,但每个任务的物理地址不同。我不会进一步详细说明为什么使用假定的固定地址空间是一个好处。操作系统使用的另一个方面是内存管理。然而,许多 MMU 会让您对内存进行分段。如果用户想要分配 100 兆字节的内存,程序可以在其虚拟地址空间中访问 100 兆字节,就好像它是线性的,并且在该地址空间中它是线性的,但是这 100 兆字节可能会被分解为 4 KB 的块,这些块是分散在物理地址空间的所有地方,并不总是可能但在技术上肯定有可能该物理内存中没有两个块与该 100 兆的任何其他块相邻。您的内存管理不一定要尝试保持大量物理内存块可供应用程序分配。请注意,并非所有 MMU 都完全相同,4Kbytes 只是一个示例。虚拟地址空间对操作系统的第三个主要好处是保护。如果应用程序绑定到虚拟地址空间,通常很容易防止该应用程序接触任何其他应用程序或操作系统的内存。在这种情况下,应用程序将在保护级别操作/执行,以便所有访问都被视为虚拟访问,并且必须通过转换为物理访问,用于定义虚拟到物理的表可以包含保护标志。如果应用程序在其虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获该地址并让操作系统采取措施来处理它(虚拟化某些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供其交易的虚假数据等)。防止该应用程序接触任何其他应用程序或操作系统的内存通常很容易。在这种情况下,应用程序将在保护级别运行/执行,以便所有访问都被视为虚拟访问,并且必须通过转换为物理访问,用于定义虚拟到物理的表可以包含保护标志。如果应用程序在它的虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获它并让操作系统采取行动来处理它(虚拟化一些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供虚假数据以进行交易等)。防止该应用程序接触任何其他应用程序或操作系统的内存通常很容易。在这种情况下,应用程序将在保护级别运行/执行,以便所有访问都被视为虚拟访问,并且必须通过转换为物理访问,用于定义虚拟到物理的表可以包含保护标志。如果应用程序在它的虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获它并让操作系统采取行动来处理它(虚拟化一些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供虚假数据以进行交易等)。在这种情况下,应用程序将在保护级别运行/执行,以便所有访问都被视为虚拟访问,并且必须通过转换为物理访问,用于定义虚拟到物理的表可以包含保护标志。如果应用程序在它的虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获它并让操作系统采取行动来处理它(虚拟化一些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供虚假数据以进行交易等)。在这种情况下,应用程序将在保护级别运行/执行,以便所有访问都被视为虚拟访问,并且必须通过转换为物理访问,用于定义虚拟到物理的表可以包含保护标志。如果应用程序在它的虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获它并让操作系统采取行动来处理它(虚拟化一些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供虚假数据以进行交易等)。用于定义虚拟到物理的表可以包含保护标志。如果应用程序在它的虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获它并让操作系统采取行动来处理它(虚拟化一些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供虚假数据以进行交易等)。用于定义虚拟到物理的表可以包含保护标志。如果应用程序在它的虚拟空间中寻址到它没有业务访问的内存地址,硬件可以捕获它并让操作系统采取行动来处理它(虚拟化一些硬件,弹出错误并终止应用程序,弹出警告并且不杀死应用程序,但同时为应用程序提供虚假数据以进行交易等)。

有很多方法可以在嵌入式系统中使用它。首先很多嵌入式系统都运行操作系统,所以以上所有,对于地址空间的程序编译容易,内存管理相对容易,以及保护其他应用程序和操作系统等好处都没有提到。(虚拟化是一个,能够逐块启用/禁用指令/数据缓存是另一个)

底线是大卫 S 指出的。虚拟内存只是意味着虚拟地址不一定等于物理地址,它可以但不一定是,有一些边界,一些硬件,通常是表驱动的,将虚拟地址转换为物理地址。您想要这样做的原因有很多,因为某些嵌入式系统与非嵌入式系统无法区分,任何适用于非嵌入式系统的原因都可以适用于嵌入式系统。

尽管人们可能希望您相信系统具有平坦的地址空间,但这通常是一种错觉。例如,在微控制器中,您可能有多个闪存库和一个或多个内存库。这些银行中的每一个都有一个物理的、通常基于零的地址。即使没有 mmu 或其他类似的东西,在处理器上的地址总线和闪存或 RAM 存储器上的地址总线之间也有一个地方,它解码处理器上的地址并使用它来寻址到特定的内存组. 通常低位匹配,高位负责存储库的选择(这通常也是 mmu 的情况),因此从这个意义上说,处理器生活在虚拟地址空间中。(不限于微控制器,这通常是处理器地址总线的处理方式)对于取决于引脚被拉高或拉低或其他一些机制的微控制器,您可能具有允许一个闪存组用于启动处理器或另一个的芯片功能。您可以将输入引脚拉高,并且引导加载程序中内置的处理器允许您访问和调试系统,例如重新编程应用程序闪存。或者也许将那条线拉低并引导应用程序闪存而不是供应商的调试器/引导闪存。一些芯片变得更加复杂,让你启动一个闪存,然后程序在某处写入一个寄存器,立即改变内存架构移动事物,

现在,当您谈论虚拟内存以及交换磁盘和从磁盘交换时,这是操作系统经常使用的一种技巧,以产生拥有更多内存的错觉。我在上面的虚拟化类别下提到了这一点。虚拟内存实际上并不存在,我有 X 字节,但会让软件认为有 Y 字节(其中 Y 大于 X)可用。操作系统通过硬件使用的虚拟表,管理哪些内存块与物理内存绑定,并允许硬件按原样完成,或者以某种方式标记为不可用,从而导致操作系统异常,经过检查,操作系统确定这是此应用程序的有效地址,但此地址后面的数据已交换到磁盘。
与说明 vmware 或其他虚拟机的工作方式没有什么不同。您可以使用虚拟内存在硬件上本地执行指令,直到您导致异常,虚拟机可能认为您有一个 xyz 网络接口并且可能有一个驱动程序正在访问该 xyz 网络接口中的寄存器,但现实您是否没有 xyz 硬件和/或您不希望虚拟机应用程序访问该硬件,因此您对其进行虚拟化,捕获该寄存器访问权限,并使用模拟您伪造该访问权限的硬件的软件,并让程序在虚拟机继续。这显然不是做虚拟机的唯一方法,但如果硬件支持它,这是一种方法,可以让虚拟机运行得非常快,占它实际在硬件上运行指令的时间的百分比。虚拟化最慢的方法当然是虚拟化包括处理器在内的所有内容,在这种情况下,每条指令都将被模拟,这很慢但有其自身的特点(在 x86 上虚拟化 arm 系统或在 arm 上虚拟化 x86,xyz 在abc,填空)。如果这是您在嵌入式系统中谈论的虚拟内存类型,那么如果嵌入式系统在很大程度上与非嵌入式系统(例如 xbox 或 tivo)无法区分,那么出于同样的原因,您可以允许这样的事情。如果您使用的是微控制器,那么那里的用例通常意味着如果您需要更多内存,您会购买更大的微控制器,或者为系统添加更多内存,或者更改应用程序的需求,使其不需要那么多内存. 可能会有例外,但这主要取决于您的应用程序和要求,允许应用程序或其数据大于可用内存的通用或通用系统将需要某种解决方案。您的无钥匙进入密钥卡或电视遥控器或时钟收音机中的微控制器或任何通常不需要允许“应用程序”需要比物理上更多的资源的东西。

于 2013-01-08T04:18:47.253 回答
2

使用虚拟内存更重要的好处是每个进程都有自己的地址空间,该地址空间与其他进程的地址空间隔离。这样,虚拟内存有助于控制故障并提高安全性和稳定性。我应该注意,两个进程仍然可以共享一些内存,以促进通信(共享内存 IPC)。

您还可以做其他技巧,例如通过将共享部分映射到多个进程的地址空间(嵌入式使用时想到 libc)来节省内存,但在物理内存中只有一次。fork/clone这也提高了它的速度,您甚至可以通过仅复制内核描述符并将内存映像单独保留直到第一次写入访问以类似的想法完成的方式来进一步增强它,就像 linux降低成本一样。

最后一个好处是,在现代系统中,通常通过将文件映射到进程空间来执行文件 I/O(mmap例如参见)。

于 2013-01-03T04:54:16.393 回答
1

有趣的是,无需成熟的 MMU 即可获得“虚拟内存”的一些好处。硬件要求有时可能非常轻。PIC 16C505 有 5 位地址空间和 40 字节 RAM;地址 0x10 到 0x1F 可以映射到两组 16 字节 RAM 中的任何一组。在编写需要管理两个不同数据流的应用程序时,我安排使与一个数据流相关联的所有变量都位于第一组 16 个“可切换”内存位置,而与另一个数据流相关联的变量将位于相应的第二组地址。然后我可以使用相同的代码来管理两个数据流。只需以一种方式设置银行位,调用例程,以另一种方式设置,然后再次调用例程。

于 2013-01-08T00:47:43.703 回答
-2

存在虚拟内存的原因之一是您的设备可以进行多任务处理。它也可以像您的 RAM 一样,从而减轻物理 RAM 的负载并来回交换负载。

于 2013-01-03T04:56:49.387 回答