扁平内存模型和保护内存模型有什么区别?

5

平面内存模型和保护内存模型的区别是什么?VxWorks支持平面内存模型,Linux也支持平面内存模型吗?

1个回答

15
为了给出一个有意义的答案,让我们首先回顾一些概念。
大多数现代处理器都有一个内存管理单元(MMU),用于多种用途。
其中一个用途是映射虚拟地址(CPU“看到”的地址)和物理地址(芯片实际连接的地址)。这称为地址转换。
另一个用途是为某些虚拟内存位置设置访问属性(例如内存可读写、只读或不可访问)。
通过使用MMU,您可以拥有所谓的"统一映射",其中处理器的虚拟地址与物理地址相同(即不使用地址转换)。例如,如果处理器访问0x10000,则它正在访问物理位置0x10000。
"平面"内存模型通常指的是CPU访问的任何虚拟地址都是唯一的。因此,对于32位CPU,您最多只能使用4G的地址空间。
它通常(但不一定)用于指虚拟和物理内存之间的统一映射。
相比之下,在工作站世界中,大多数操作系统(Linux / Windows)使用"重叠"内存模型。例如,在Windows中启动的任何程序(进程)都会有一个起始地址为0x10000。
Windows怎么能有10个进程都从地址0x10000运行?
这是因为每个进程都使用MMU将虚拟地址0x10000映射到不同的物理地址。因此,P1可以具有0x10000 = 0x10000,而P2具有0x10000 = 0x40000等。
在RAM中,程序位于不同的物理地址,但CPU虚拟地址空间对于每个进程看起来都是相同的。
据我所知,Windows和标准Linux始终使用重叠模型(即它们没有平面模型)。uLinux或其他特殊内核可能具有平面模型。

现在,保护与扁平模型和受保护模型无关。我认为大多数重叠模型的操作系统都会使用保护机制,以便一个进程不会影响(即写入)另一个进程的内存。

随着VxWorks 6.x和实时进程的引入,即使使用扁平内存模型,通过使用保护,单个RTP也能相互保护(以及内核应用程序)。

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


那么,保护如何工作(无论是在VxWorks RTP还是其他OSes进程中)? 基本上,RTP / Process存在于包含代码、数据、堆和其他各种内存位置的一定范围(虚拟)地址的"内存泡沫"内。

如果RTP / Process尝试访问其范围之外的内存位置,则MMU会生成异常,并调用OS(或信号处理程序)。典型结果是段错误/总线异常。

但是,如果进程无法逃离其内存泡沫,如何将数据包发送到以太网端口?这因处理器体系结构而异,但基本上,用户端(RTP)套接字库(例如)进行“系统调用”-这是一条特殊指令,将CPU切换到内核空间和监管模式。此时,一些设备驱动程序(通常驻留在内核中)运行以将数据推送到某个硬件设备。完成后,系统调用返回,我们回到RTP / Process空间,运行用户代码。

操作系统负责所有MMU编程、系统调用处理等等... 应用程序看不到这些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接