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

Linux 平面内存模型和受保护内存模型之间的区别?,linux,memory,memory-management,model,vxworks,Linux,Memory,Memory Management,Model,Vxworks,平面内存模型和受保护内存模型之间的区别?VxWorks支持平面内存模型,Linux也支持平面内存模型吗?为了给出有意义的答案,让我们先回顾一下一些概念 大多数现代处理器都有一个内存管理单元(MMU),用于多种用途 一个目的是在虚拟地址(CPU“看到”的地址)和物理地址(芯片实际连接的地址)之间进行映射。这叫做地址转换 另一个目的是为某些虚拟内存位置设置访问属性(例如内存是读写、只读或不可访问的) 使用MMU,您可以拥有所谓的“统一映射”,其中处理器的虚拟地址与物理地址相同(即不使用地址转换)。例

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

为了给出有意义的答案,让我们先回顾一下一些概念

大多数现代处理器都有一个内存管理单元(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 RTPs还是其他操作系统过程中)? 本质上,RTP/进程存在于一个“内存气泡”中,具有一定范围的(虚拟)地址,其中包含代码、数据、堆和其他各种内存位置

如果RTP/进程试图访问其冒泡外部的内存位置,MMU将生成异常并调用OS(或信号处理程序)。典型的结果是段冲突/总线异常

但是,如果进程无法摆脱内存泡沫,它怎么能将数据包发送到以太网端口呢?这因处理器体系结构而异,但本质上,用户端(RTP)套接字库(例如)进行“系统调用”——这是一种特殊指令,用于将cpu切换到内核空间和管理器模式。此时,运行某种设备驱动程序(通常位于内核中)将数据推送到某个硬件设备。完成后,系统调用返回,我们回到运行用户代码的RTP/进程空间

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