平面内存模型和受保护内存模型之间的区别?

平面内存模型和受保护内存模型之间的区别? VxWorks支持平面内存模型,Linux是否也支持平面内存模型?

Solutions Collecting From Web of "平面内存模型和受保护内存模型之间的区别?"

为了给出一个合理的答案,我们首先回顾一下一些概念。

大多数现代处理器都有一个内存管理单元(MMU),用于多种目的。

一个目的是在虚拟地址(CPU“看到”的地址)和物理地址(芯片实际连接的地址)之间进行映射。 这被称为地址转换。

另一个目的是为某些虚拟内存位置设置访问属性(像内存是可读写或只读的,或不可访问的)

使用MMU,可以在处理器的虚拟地址与物理地址相同的情况下(即不使用地址转换)拥有所谓的“统一映射”。 例如,如果处理器访问0x10000,则它正在访问物理位置​​0x10000。

一个“平坦的”内存模型通常指的是CPU访问的任何虚拟地址都是唯一的。 因此,对于32位CPU,地址空间的最大限制为4G。

它通常(但不一定)用于指代虚拟和物理内存之间的统一映射。

相比之下,在工作站领域,大多数操作系统(Linux / Windows)使用“重叠”内存模型。 例如,您在Windows中启动的任何程序(一个进程)将具有0x10000的起始地址。

窗口如何有10个进程全部从地址0x10000运行?

这是因为每个进程都使用MMU将虚拟地址0x10000映射到不同的物理地址。 到P1可能有0x10000 = 0x10000而P2有0x10000 = 0x40000,等等…

在RAM中,程序位于不同的物理地址,但CPU虚拟地址空间在每个进程中看起来都是相同的。

据我所知,Windows和Standard Linux总是使用一个重叠的模型(即他们没有一个平坦的模型)。 uLinux或其他特殊内核可能有一个扁平的模型。

现在,保护与平坦与保护模式无关。 我会说,大多数重叠的模型操作系统将使用保护,以便一个进程不会影响(即写入)另一个进程。

使用VxWorks 6.x和引入实时进程,即使使用平面内存模型,也可以通过使用保护来保护各个RTP(和内核应用程序)。

如果您不使用RTP并在vxWorks内核中运行所有内容,则不会使用保护。


那么,保护如何工作(无论是在VxWorks RTP还是其他操作系统进程中)呢? 从本质上讲,RTP / Process存在于一个具有一定范围的(虚拟)地址的“存储泡泡”中,该地址包含代码,数据,堆和其他各种存储位置。

如果RTP / Process尝试访问其外部的存储器位置,则MMU将生成一个异常,并调用OS(或信号处理程序)。 典型的结果是段违例/总线例外。

但是如果一个进程无法逃离它的内存泡泡,一个进程如何将一个数据包发送到以太网端口? 这取决于处理器体系结构,但本质上,用户端(RTP)套接字库(例如)会进行“系统调用” – 这是一个将cpu切换到内核空间和超级用户模式的特殊指令。 此时,某种设备驱动程序(通常驻留在内核中)运行将数据推送到某个硬件设备。 一旦完成,系统调用返回,我们回到运行用户代码的RTP /进程空间。

操作系统负责所有的MMU编程,系统调用处理等等,这对应用程序是不可见的。