Embedded 为什么嵌入式系统需要虚拟内存?

Embedded 为什么嵌入式系统需要虚拟内存?,embedded,Embedded,根据我的理解,虚拟内存如下所示: 程序/应用程序/可执行文件驻留在存储设备中。存储设备访问比RAM慢得多。因此,程序从存储器复制到主存执行。由于计算机的主内存(RAM)有限,当使用所有RAM时(例如,如果有许多程序同时打开或一个非常大的程序正在使用),启用虚拟内存的计算机将根据需要将数据交换到HDD并返回内存,从而实际上增加了系统总内存 据我所知,大多数嵌入式设备没有磁盘存储器(如智能手机或车载信息娱乐系统)。代码直接从闪存执行。RAM主要用作草稿行区域(本地变量、返回地址等) 那么为什么我们需

根据我的理解,虚拟内存如下所示:

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

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


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

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

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


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

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

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

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

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


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

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

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

嵌入式系统,该术语本身有广泛的应用。你可以把一个小型微控制器称为嵌入式系统,它的闪存程序空间以千字节或更小的单位测量,ram以位或字节(不足以达到千字节)的单位测量。同样,tivo作为嵌入式系统,在相当成熟的计算机主板上运行成熟的操作系统(用xbox代替tivo)。所以你需要对你的问题少一些含糊不清。虚拟内存与这些无关,它的应用程序跨越了这些界限

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

虚拟内存是一种流行的用途,我可能会说主要的用途是操作系统。一个好处是,例如,所有的应用程序都可以为相同的地址空间编译,所有的应用程序都可以编译成这样,从程序的角度来看,它们都从地址0x8000开始,并且只要程序运行并访问内存,它就可以基于该地址访问内容。硬件和操作系统的组合将程序使用的虚拟地址更改为物理地址。如果操作系统允许多任务处理,那么每个任务可能认为它们位于相同的地址空间中,但每个任务的物理地址都不同。我将不再详细说明为什么要使用