Tim*_*Tim 7 memory operating-systems computer-architecture
我正在尝试了解平面内存模型和分段内存模型。
扁平内存模型和分段内存模型是由 CPU 架构还是操作系统或两者决定的?
或者它们不是由 CPU 架构和操作系统决定的,而是对于具有任何 CPU 架构和安装操作系统的任何计算机上的程序员来说都是可用的选项?
如果是后者,什么样的编程需要考虑 Flat 内存模型和 Segmented 内存模型?汇编、C 和/或其他高级编程语言?
以下是维基百科的一些引文,让我感到困惑。
来自http://en.wikipedia.org/wiki/Address_space#Memory_models:
早期的 x86 计算机使用基于两个数字组合的分段内存模型地址:内存段和该段内的偏移量。某些段被隐式地视为代码段,专用于指令、堆栈段或普通数据段。尽管用法不同,但段没有反映这一点的不同内存保护。
现在,许多程序员更喜欢使用平面内存模型,其中所有段(段寄存器)一般都设置为零,并且只有偏移量是可变的。
来自http://en.wikipedia.org/wiki/Flat_memory_model#Comparison:
平面记忆模型
- 不适合通用计算或多任务操作系统,除非通过额外的内存管理硬件/软件进行增强;但这在现代 CISC 处理器中几乎总是如此,它们在平面内存模型上实现了先进的内存管理和保护技术。Linux 例如使用平面内存模型比较 X86_memory_segmentation#Practices。
分段内存模型
- 在原始英特尔 8086、8088、80186、80286 中实现,并由 80386 和所有后续 x86 机器支持,直到今天的奔腾和酷睿 2 处理器。这种内存模型一直保留在 x86 机器中,现在提供多模式操作,并且很少在兼容的分段模式下操作。
使用的内存模型由两件事决定:
从程序员的角度来看,除非您正在处理内核代码,否则您会得到操作系统给您的东西。在大多数现代操作系统中,这是一种分页内存模型。
对于将在用户空间的现代操作系统上执行的代码,就进程而言,内存模型是扁平的。这是因为操作系统为进程提供了一个虚拟内存空间,该空间隐藏了内存中可能发生的所有分页、交换和其他事情。这个抽象层非常非常有用,因为它不会强迫程序员为了整个系统的利益而善用内存。
从历史上看,情况并非总是如此。
Windows 3.1x、MacOS v9 和 Novell NetWare 都缺乏一些我们在 Linux/Windows/OSX 中理所当然的内存保护。具体而言,NetWare 为所有正在运行的代码提供了一个大内存空间,因此一个试图访问它实际上并未分配的内存的错误实际上可能会获得该内存,并且通常会导致整个系统崩溃。出于这个原因,为 NetWare 编程的程序员必须非常小心内存管理,并且在某种程度上 Linux/windows/OSX 程序员不需要打扰。
然而,即使 NetWare 使用了内存的分页模型,它只是没有为每个进程提供虚拟内存空间,而是给了它实际的内存空间。
所使用的内存模型并非适用于所有编程,而是最接近硬件的。内核编程和嵌入式设备编程是这些事情非常重要的领域。
“内存模型”既是一个低级概念,也是一个(相对)高级别的概念。
在过去,具有分段内存模型的处理器与具有“分页”或“映射”内存模型的处理器之间存在着一些“战争”。Burroughs B5000 系列机器和 Plessey 250 使用具有“能力”(或“描述符”)的分段内存模型。也就是说,物理存储不是作为概念上的固定大小的页面管理的,而是作为可变长度的段来管理的,每个段对应于某个逻辑实体(例如,一个过程或一个对象)。为了在段之间寻址,使用了只能以受保护的方式加载的“能力寄存器”,其中包含段的物理地址、段的长度和执行权限(例如,读/写/执行)程序被赋予引用该段。
当“分页”系统仍在努力起步时,这些系统正在愉快地运行。
最初的 PC 基于 8086 处理器,该处理器旨在支持穷人的分段架构。IIRC 有四个段寄存器,可以选择将它们添加到 16 位通用寄存器值中以生成 20 位地址。理论是这些寄存器将在软件中管理,有点类似于 Burroughs 和 Plessey 系统如何通过更多的硬件支持来管理它们。但是在可以生产出使用此功能的好软件之前,DOS 已被塞入 8086,因此该功能从未真正得到有效使用。
至于哪个更好,好吧,这已经不重要了,因为分段模型不存在于任何“真实”(非实验)环境中。但在过去,分段模型通常表现更好,并使操作系统更加健壮。主要的负面因素是它对编译器和程序员施加了限制,这与当时和现在许多程序员的“狂野西部”态度不一致。
“分页”模型假定地址空间被划分为特定大小的“页面”(尽管在某些情况下支持几种不同的页面大小)。通常页面大小介于 256 字节和 64k 字节之间(总是 2 的幂)。还假设硬件包含某种地址转换支持,以便“逻辑”地址(程序“地址空间”中的地址)可以映射到“物理”地址(RAM 中的地址)。
分页模型的实现主要有两个原因:
还可以使用页面转换硬件的一些次要功能,例如设置读/写/执行权限,允许某些页面在进程/线程之间“共享”等。
忽略可以说是第一个计算机内存模型的哈佛模型,扁平冯诺依曼存储模型是第一个实现通用的模型。这基本上是——一个“扁平”的地址空间,由未区分的字(直到游戏后期才开始)的“扁平”地址空间从地址零开始并继续向上到可用内存的“顶部”。内存“底部”或“顶部”的某些内存部分将保留给某种“加载程序”,其余部分可用于单个执行程序。一次运行一个程序,该程序能够使用除那一小块预留 RAM 区域之外的所有区域。
事情慢慢发生了变化,小保留区变得更大,可以容纳各种操作系统,但一次仍然只有一个程序。随着时间的推移,人们发明了各种技巧以允许例如某些专门的程序在内存的“角落”中运行,允许假脱机程序等与用户的程序共存。
但推动“多道程序”正在施加压力。一些系统添加了粗略的地址映射硬件,使多个程序每个都有自己的地址空间。其他系统要求程序“自重定位”,以便它们可以在内存中的任何地方运行,而不是“链接”到特定地址。
早期的 Unix(以及其他)通过“交换”程序进出来处理多道程序工作:一个程序(在地址零加载)将运行直到它“阻塞”来执行 I/O,然后它会被“交换”(在它的整个,包括所有代码和数据)到磁盘和一个不同的程序“交换”。
但在大多数情况下,这些技术慢慢演变(或可能退化)为各种形式的页面映射存储模型。
| 归档时间: |
|
| 查看次数: |
12136 次 |
| 最近记录: |