分类:
2010-06-30 09:25:23
早期的CPU无所谓内存管理模式,程序指定绝对的内存地址,处理器到这个地址抓指令参数。现在CPU都不这样了(当然,CPU工作在实模式下,仍然是这样)。这样对内存没有任何处理,既不利于对CPU之上操作系统对程序的控制,同时,也不利于程序的编程和移植。所以IA-32 CPU增加了内存管理模块,即:MMU(memory management unit)。同时,定义了三种内存管理模型:
* 扁平模型(flat memory model)
* 分段模型(segment memory model)
* 实地址模型(real-address memory model)
随着保护模式和MMU的加入,CPU越趋完善。第一种实地址模式模型(real-address mode model)所操作的都是实际的物理地址,不利于对内存的特定代码的保护,例如操作系统。于是Intel结合MMU推出了后两种模式模型。后两种模型下, 段仍旧是“完整地址的一部分”,但是他们不是一个完整地址的某几位了,而是一个整数而已,这个整数和完整的偏移地址结合在一起,会被CPU的MMU翻译成绝对的物理地址。这是段的第二个意义。他们统称内存段或者地址段,因为与地址相关。暂时不理解没有关系。总之,对内存段有个概念。
在MASM汇编语言里面,段被称为程序逻辑段,此为段的第三个意义。比如程序分为三个段:数据段,代码段,stack段。他们不一定对应于具体的一个地址段。根据你代码工作在的处理器模式和内存模型而有所不同。需要指出的是MASM定义的内存模型不等同于如上所述的CPU的内存模型。他们基于CPU的内存模型,但是比之更具体,比如MASM有7种内存模型:
windows98和NT一样,如果程序是对“ISA+操作系统”编程或者说运行在这些操作系统之下。都要指定内存模式为flat。
内存模式
模 式 |
内 存 使 用 方 式 |
tiny small medium compact large huge flat |
用来建立 .com文件,所有的代码、数据和堆栈都在同一个64 KB段内 建立代码和数据分别用一个64 KB段的 .exe文件 代码段可以有多个64 KB段,数据段只有一个64 KB段 代码段只有一个64 KB段,数据段可以有多个64 KB段 代码段和数据段都可以有多个64 KB段 同large,并且数据段中的一个数组也可以超过64 KB Win32程序使用的模式,代码和数据段使用同一个4 GB段 |
平面内存模式 (flat memory model)
是一种组织 内存 寻址空间 的方式。在这种模式下,一个电脑的应用程序最多使用两个 内存段,一个是给程序使用,另外一个是资料。此外,同样的段也可以用量同时给程序或是资料使用,但这是不必要的,因为只有对于 我更改程序 的程序才有用处,但这种 程序设计风格 现今被视为一种很不好的方法。
平面内存模型的优点
应用程序在存取他们的资料时候不需要切换不同的段。然而,在 16 位元的 Intel 8086 和 80286 中,这种方式是不可行的,因为应用程序无法存取超过 64 KB 的资料。在 32 位元的芯,应用程序可以存取最大到 4 GB 的资料。但这也变成现在大的数据库以及像是影编辑应用程序的问题。