嵌入式系统,该术语本身具有广泛的应用。您可以将闪存程序空间以 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)无法区分,那么出于同样的原因,您可以允许这样的事情。如果您使用的是微控制器,那么那里的用例通常意味着如果您需要更多内存,您会购买更大的微控制器,或者为系统添加更多内存,或者更改应用程序的需求,使其不需要那么多内存. 可能会有例外,但这主要取决于您的应用程序和要求,允许应用程序或其数据大于可用内存的通用或通用系统将需要某种解决方案。您的无钥匙进入密钥卡或电视遥控器或时钟收音机中的微控制器或任何通常不需要允许“应用程序”需要比物理上更多的资源的东西。