我正在学习计算机体系结构,并且遇到了一个声明:“可以在没有虚拟内存的情况下运行,只需要物理内存(实际上,大多数嵌入式系统以这种方式运行)”。
这是真的吗?如果是,那我想知道怎么做?
感谢。
答案 0 :(得分:4)
不使用虚拟内存的嵌入式系统通常作为单个进程或线程运行,或者支持多线程而不是多处理任务模型。也就是说,所有线程/任务共享一个公共地址空间,但具有单独的堆栈(尽管也在单个地址空间中)。
在具有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是一款针对处理器的GPOS,这些处理器具有足够的内存资源来运行Linux但缺少MMU(如ARM7和Cortex-M)。虽然可以说,没有MMU的Linux却错过了使用Linux的一个主要优点,同时缺乏硬实时性能,并且需要大量内存;典型的RTOS内核需要(多)少于10kB的代码。答案 1 :(得分:2)
虚拟内存只是一种呈现物理内存的方式,因此每个进程都有一个单独的内存空间。这种间接是通过一个称为MMU(内存管理单元)的特殊硬件单元实现的。
早期的计算机系统直接使用了物理内存。这导致了一个安全问题,即一个用户可以访问同一系统上所有其他用户的进程内存。虚拟内存通过使每个进程的内存空间分开来解决此问题。
答案 2 :(得分:2)
一个世界,其中,"可以在没有虚拟内存的情况下运行,只需要物理内存。"
嘿,我在那个世界长大了!虚拟内存的概念自50年代开始就存在,但个人电脑直到90年代初才支持虚拟内存。在当天,PC是单一过程 - 当您完成文字处理应用程序后,您将退出并加载电子表格应用程序。
现代嵌入式系统,例如控制您的洗衣机或汽车中的引擎,是一个单一的过程设备 - 虚拟内存和提供它的MMU在瓦特,芯片和开发工作方面是不必要的成本。
也就是说,完全可以在单个地址空间中运行多个应用程序。您可以确保编译器吐出可重定位代码(即,所有跳转到本地函数都是相对的,因为对全局数据的引用)在这种情况下,每个应用程序都可以在操作系统认为合适的地方加载并且将正常运行(即Linux共享或者你可以用这样的方式在文件中表示应用程序,以便它们可以在加载时重新定位。即,当加载到任意基地址时,操作系统会在加载期间更正地址引用(即Windows DLL和EXE)
答案 3 :(得分:1)
在虚拟内存之前,如果您对在同一地址空间中运行的不同应用程序感兴趣。然后在任务切换期间,您只需将一个应用程序数据从一个地址空间复制到另一个地址空间进行存储,将另一个任务从其存储复制到该地址空间并让它运行一段时间。为什么你希望让应用程序在没有虚拟内存系统的系统上运行在同一个地方是不可理解的,但如果你真的觉得你必须这样做。很明显,操作系统早于虚拟内存系统,因此研究这些操作系统以了解它们的工作原理是一件简单的事情。
它让我想起了一个问题,有人问我们当天是如何处理x86世界中的64K边界的。答案是,我们通常没有制作大型或需要大数据的程序。所以这不是一个真正的问题。当然,有一些应用程序可以处理数据级别的数据,这些数据无法在一个空间(实际上)处理,我们会处理这些数据,但大多数应用程序将大部分时间都花在可用的内存空间中。我们当时做过,在此之前我们并不担心不存在的虚拟内存及其附带的功能。
答案 4 :(得分:0)
我记得当物理内存不足时,虚拟内存用于交换数据块 所以我认为在没有虚拟内存的情况下,计算机不能运行嵌入式系统,它们完全不同: 计算机是通用的,即它们可以做各种各样的动作:播放电影,游戏等 嵌入式系统有一个特定的目的,如运行ATM,因此物理内存较小,大多数时候它们不需要虚拟内存