代码改变世界

32位微机的内存管理模式

2011-06-14 11:59  李龙江  阅读(1144)  评论(0编辑  收藏  举报

32位微机的内存存管理仍然采用“分段”的管理模式,存储器的逻辑地址同样由段地址和偏移量两部分组成。32位微机的内存管理与16位微机的有相同之处,也有不同之处,因为它提供了两种不同工作方式:实方式和保护方式。

1、物理地址的计算方式

  实方式:段地址仍然是16的倍数,每个段的最大容量仍为64K。段寄存器的值是段的起始地址,存储单元的物理地址仍为段寄存器的值乘16,再加上段内  偏移量。在此方式下,32位微机的内存管理与16位微机是相一致的。

  保护方式:段地址可以长达32位,其值可以不是16的倍数,每个段的最大容量可达4G。段寄存器的值是表示段地址的“选择器”(Selector),用该“选择器”可从内存中得到一个32位的段地址,存储单元的物理地址就是该段地址加上段内偏移量,这与16位微机的物理地址计算完全不同。

2、段寄存器的引用

  32位CPU内有6个段寄存器,程序在某一时刻可访问6个不同的段。其段寄存器的值在不同的方式下具有不同的含义:

    1、在实方式下,段寄存器的值就是段地址;
 
    2、在保护方式下,段寄存器的值不是段地址,是段地址的“选择器”。它间接指出一个32位的段地址。
 

下面分别说明各段寄存器的用法和作用。

  代码段寄存器:32位微机在取指令时,系统自动引用CS和EIP来取出下条指令。在实方式下,由于段的最大容量不超过64K,所以,EIP的高16位全为0,其效果相当于16位CPU中的IP。

堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。但在不同的方式下其堆栈指针有所不同:

  1)、在实方式下,32位微机把ESP的低16位SP作为指向堆栈的指针,所以,我们可以认为栈顶单元是由SS和SP来指定的。这就与16位微机访问栈顶单元的方法相一致;

  2)、在保护方式下,堆栈指针可用32位的ESP和16位的SP。

数据段寄存器:DS是主要的数据段寄存器。通常情况下,它是除访问堆栈以外数据时的默认段寄存器。在某些串操作中,其目的操作数的段寄存器被指定为ES是另一个例外。

  另外,段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器,但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。

一般来说,程序频繁访问的数据段用DS来指向,不太经常访问的数据段可用ES、FS和GS等来指向。

3、存储单元的内容

  32位微机存储单元内容的存储格式与16位微机的完全一致,也都采用“高高低低”的原则来存放数据。