Operating system 完全可以在没有虚拟内存的情况下运行,只有物理内存(事实上,大多数嵌入式系统都是这样运行的)。怎么用?

Operating system 完全可以在没有虚拟内存的情况下运行,只有物理内存(事实上,大多数嵌入式系统都是这样运行的)。怎么用?,operating-system,embedded,computer-architecture,Operating System,Embedded,Computer Architecture,我正在学习计算机体系结构,遇到了一句话:“完全可以在没有虚拟内存的情况下运行,只有物理内存(事实上,大多数嵌入式系统都是这样运行的)” 那么这是真的吗?如果是,那么我想知道怎么做 谢谢。虚拟内存只是表示物理内存的一种方式,这样每个进程都有一个单独的内存空间。这种间接寻址是由一个称为(内存管理单元)的特殊硬件单元实现的 早期的计算机系统只是直接使用物理内存。这导致了安全问题,其中一个用户可以访问同一系统上所有其他用户的进程内存。虚拟内存通过将每个进程的内存空间分开来解决此问题。在虚拟内存之前,如果

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

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


谢谢。

虚拟内存只是表示物理内存的一种方式,这样每个进程都有一个单独的内存空间。这种间接寻址是由一个称为(内存管理单元)的特殊硬件单元实现的


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

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

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

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

嘿,我在那个世界长大

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

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


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

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

在具有MMU并支持虚拟内存的处理器上,只需不配置MMU,或至少使用一对一映射的静态MMU配置,以使物理地址和MMU地址相同,或至少有一个虚拟地址空间,即可完成此操作

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

对于无MMU系统中的多线程支持,您通常会使用实时操作系统(RTOS)。除了一些明显的例外,大多数RTO都是带有IPC和同步原语的简单任务调度器,不使用或支持MMU。QNX和VxWorks等高端RTO具有MMU支持,但在VxWorks中是可选的


uCLinux是一种GPO,其目标处理器具有足够的内存资源来运行Linux,但缺少MMU,如ARM7和Cortex-M。尽管可以说,没有MMU的Linux忽略了使用Linux的一个主要优势,同时缺乏硬实时性能,并且需要大内存;一个典型的RTOS内核所需的代码(远远)少于10万字节。

是的,但是如果没有虚拟内存的概念呢。那么,有没有可能在没有虚拟内存的情况下运行,仅仅是物理内存?是的,μClinux是Linux的一个变种,它是为在没有虚拟内存的情况下运行而构建的,现在听上去很清楚了,只有一个问题?在执行中的两个进程是否可能产生相同的逻辑地址?在虚拟内存中,是的,两个进程可以在内部引用相同的逻辑地址,但是这个地址将被映射到两个物理上不同的位置。作为一个问题,而不是对不同主题的评论。