中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 内存术语详解 上一主题 | 下一主题
dos_fan
初级用户




积分 152
发帖 10
注册 2004-2-24
状态 离线
『楼 主』:  内存术语详解

内存术语详解

   你可能听到或读到过 Epanded memory(扩充内存),EMS,Extended memory(扩展内存),XMS,EMM,UMB,HMA,VCPI,以及 DPMI 这些术语。为解释诸程序如何被分配来访问1MB以外的内存,本篇将定义这些术语,这样当这些概念同后面各篇相联系时你就熟悉它们了。正如我们现今所知道的那样 PC 机的体系结构以完全可使用的1024K(1MB)内存空间为基础。就 DOS 而言,1MB就是可供使用的全部内存,但对现实世界的使用而言,1MB内存被证明为太少;用户们希望拥有比较大的文档和较大的电子数据表和数据库,而程序员们编写更强有力的程序则要求更大的可执行文件(运行诸程序的诸文件)。
    为响应 PC 机的普及和用户们的不断变化的需要,程序员们和硬件丁程师们努力探索提供更多内存和使用这些内存的方法。实际上提供更多的内存并不是太大的问题:只需插入更多的芯片或内存卡。要使额外的内存可以使用则是现实的挑战。显然,需要更多的内存空间,所以计算机行业开发了使用1MB以外内存的诸多标准。

扩充内存(Expanded Memory)

    这些标准中的第一个就是扩充内存(Expanded Memory)。扩充内存是指1MB以上的额外内存,它可以被程序访问(且在某些情形下由硬件访问),后者使用扩充内存规范(在本篇后面解释)。把扩充内存称为一个持定边界(诸如640K或1024K)之外的内存是不正确的,因为扩充内存没有实在的位置,直到它被映射为止。这就是我们把扩充内存称之为“在别的某处”的原因。扩充内存可在任何型号的IBM  PC 兼容计算机:8088,8086,80286,i386,i486,以及更高机型上使用。它被发明用于1985年使用的任何 PC 及以后的计算机上。虽然286及后来的处理器拥有保护模式,它们能够使用扩展内存(在本章稍后讨论),但使用比1MB更多的内存的第一个标准发明被用来从8088开始的任何处理器上,以便为以后尽可能大的程序和用户服务。在386及以后的计算机上,使用额外内存所必需的内存管理程序已被设值到该处理器芯片(CPU)中。在 286及以下的计算机上要求特殊的扩充内存硬件(通常是一个内存扩充板)以提供扩充内存。

扩充内存规范(EMS)

    为使用扩充内存,诸程序必须遵守扩充内布规范(EMS)--规定访问扩充内作的规则。1985年Lotus开发出EMS使程序能访问更多的内存。 Intel通过制造扩充内存板而加入。在EMS发表之后不久。Microsoft请求对规范作一些修改,并请求加入该联盟。于是我们就有了门 LIM/EMS--Lotus、Intel、Microsoft/扩充内存规范。然而,所有扩充内存问题都更适合于叫做EMS。

EMS如何工作

    EMS按间接方式工作。EMS是使DOS认为位于内存中某处的数据实际上存储在较低的640K中。
    EMS将一块内存地址重新定向到另一块内存地址。这些块可高达1MB——于是提供了程序本身可在扩充内存中运行的途径。这意味着程序可以更大。而更大的程序则可以更快地做更多的工作。
    为什么EMS必须将内存重新定向呢?因为DOS只能在640K以下看到应用程序和它们的数据。对任何1024K以外的内存DOS是看不见的。扩充内存硬件上可显示位于别的某处的一片内存,仿佛它处在1024K以下的一个地址,而不管它实际上位于何处。这个用另一个内存块的地址表示—个内存块的过程叫做映射。通过硬件和软件的组合扩充内存片就冒充为常规内存。DOS并不聪明,故程序可通过访问处于叫做页面的内存片段而使用比以前多得多的内存。

为使扩充内存投入使用,要使三件事一起进行。

1、遵循EMS编写程序;这样一个程序通常运行得快得多而且可以比仅可在常规内存中运行的程序能访问更多的数据。

2、在该计算机上安装内存管理硬件。无论你有何种类型的计算机,都需要安装超过1MB的实际的内存(芯片或卡)。在286或较低的计算机上正确类型的内存管理硬件是扩充内存卡(不是扩展内存卡——扩展内存和扩充内存是不同的)。在366或更好的计算机上正确类型的内存硬件则是处理器芯片本身(这些硬件已包含在处理器芯片中)。

3、一个EMM(扩充内存管理程序):一个EMM是一个控制扩充内存规范支持的额外内存的程序。该EMM是解释所有内存呼叫并将它们定向以确保所有程序、设备和在计算机中的其它内存引用在它们需要时得到它们想要的东西、而无冲突的交通警察。
  EMM的例子是EMM386(随D0S5和D0S6而来的),QEMM和386MAX。

扩展内存(Extended Memory)

    扩展内存是在286或更高档的计算机上的1MB以上的内存。访可扩展内存比访问扩充内存简,因为在286及更高档的计算机上的处理器芯片被设计成"知道" 关于巳安装额外内存的情况。不能在低于286的计算机亡使用扩展内存,因为其处理器并非为此而设计。遗憾得很, DOS 并不知道如何完成访问扩展内存的该简单功能。不像扩充内存(它可以实模式使用),扩展内存仅可以保护模式使用。再DOS下使用扩展内存的程序需要将该处理器置于一种特殊模式以使用扩展内存并返回另一模式以同DOS对话。

实模式和保护模式

    —台 PC 机可有若干种操作模式。一台8086拥有一种操作模式:实模式。一台286拥有两种模式:实模式和保护模式。一台i386拥有四种模式:实模式、保护模式、虚拟8086模式和平坦型32位模式。每种模式都容许对内存和其它功能的不同的访问。每一种模式都可访问完全不同的处理器模型。取决于处理器提供的较好的内存管理和较新的程序。为运行老的和新的两个现存的程序,在该芯片中有各种处理器模型可供使用。你的软件将计算机置于必要的模式以供给软件所希望的内存类别。通常使用DOS扩展器做此事。

    一个DOS扩展器是设置于一个DOS扩展程序中的一个特殊程序。当该程序想使用D0S,例如写一个文件时,它就进行一次“DOS调用”。该DOS扩展器监视这些DOS调用,并确保在DOS调用发生时,该程序将处理器团换到实模式。DOS扩展器让D0S进行其工作,然后将该处理器切换回保护模式以便该程序可继续工作。

    实模式
    在286、386、i486或Pentium计算机的三种操作模式中是最为兼容的。在实模式下,386处理器表现为复原成8086处理器。实模式是任何D0S程序都可在任何80x86计算机上运行的模式。一个 DOS 扩展程序必须从保护模式切换到实模式以访问任何DOS服务(如像保存一个文件)。在实模式下,程序不能访问一台386计算机的任何先进功能,如高级的内存管理和保护。

    保护模式
    保护模式是DOS扩展程序可在其中运行并将其数据存储在扩展内存中的模式。一个DOS扩展程序就是一个不仅可把数据存储在扩展内存中,而且在扩展内存中运行它自己的代码的程序。为了做此事,DOS扩展程序必须处在保护模式。在保护模式下,程序可访问386处理器芯片上的分页的内存管理单元并使用该处理器的32位寄存器和寻址模式。保护模式和使用它的DOS扩展程序急剧地增加了 PC 机上内存的使用,使得可使用前所未有的更
多数据的更大而又更快的程序成为可能。


扩展内存规范:XMS

    叫做扩展内存规范(xMs)的一个新规范被开发来管理扩展内存的使用。XMS提供对640K以亡的多达4千兆字节内存的访问。为做此事,需要在计算机上拥有XMS驱动程序,它是一个严格的XMS驱动程序,诸如Microsoft的HIMEM.SYS,或者包含除其它内存管理功能(EMM、高RAM访问等等)之外的一个XMS管理程序,诸如Quanerdeck的QEMM,QEMM.386,以及其它的第三方内存管理程序,针对那些仍想使用扩充内存的程序将扩展内存变换成扩充内存。因此,无论你的软件使用EMS还是XMS,内存分配都是透明的,这意味着,不必告诉内存硬件,某些内存被分派来作EMS,而其另一部份则被分派作XMS。
    存在着一个程序可访问扩展内存的若干方式。可通过从内存顶部或者从内存底部读、写分配内存地址。使用扩展内存的第一批程序之一是VDISK。它使用从底到顶的分配方法。其它程序也使用这种方法访问扩展内存,QEXT就是一个这样的程序。一个程序可有选择地位用一个XMS驱动程序来进行内存分配,然后通过该 XMS驱动程序得到它的内存。这是最常见而又最希望的利用扩展内存的方法,因为如果程序使用了利用内存的行业标准手段,则它就可以于使用同样标准的其它程序共存。使用XMS驱动程序,内存管理器(与程序相反)就百接得到该内存,而将少量内存给调用该XMS驱动程序的程序,
    XMS要求DOS 3.0或更高版本。

A20选通

    在引导时,计算机可能显示一条消息诸如“A20线被启动”。XMS利用A20线使用1024K以上的内存。 A20线是在主板上的硬件与处理器芯片的能力的组合。该A20线是80x86CPU的第21条地址线,它允许访问1024K以上的内存。若该A 20线被选通,则该处理器可看到1MB以上的内存。如果该A20线不被允许,则对1MB以上的一个内存地址的任何引用都径直向下折回到内存的起始处。该机制叫作A20“选通”,因为它决定地址线20、21、22和23(在386PC机上直到31)究竟是否被允许成为可看见的(被选通)。使用A20线, XMS还可在实模式下比它在其它情形下多利用新创立的64K常规内存。


高内存区(HMA)

    高内存区(HMA)是扩展内存的前64K。是几乎64K。内存术语充满了例外。HMA实际上是64K减去l6字节,因为HMA开始于上位内存区 (UMBs)的顶部16个字节。该HMA是唯一的。因为在实模式下,在其中的代码可被执行。这是因为它可由存在于lMB以下的16字节地址空间攫取。我们对这l6个字节吹毛求疵的缘由就在于要专门编写来在此HMA中运行的程序才可利用该闪存,虽然大多数程序没有进行重大修改,可使用HMA的程序的例子是使用DOS=HIGH的DOS 5和DOS 6,DESQview,DR DOS和Novell的XMSNET。HMA是那些可被用来增加在640K以下可供使用的内存数量的DOS内存区的小暗角之一。

上位内存块(UMBs)和扩展内存块(EMBs)

    在本篇中所讨论的所有内存规范都集中于得到对更多内存的访问。尽管在1MB以上的广大区域已被开放供使用,但640K以下的内存是最有用的,因为以DOS 可理解在那里进行的一切并以之进行工作,DOS的设备驱动程序要求非常少的640K以下的内存.但使用EMS的程序和标准(非扩展)的DOS程序专门在 640K以下运行。为在该区域中获得更多的内存资源,XMS提供使用在640K和1024K之间的内存而不是640K以下的内存的方法。通过创立可在那里装载设备驱动程序的UMBs而完成。

UMBs

    以80x86为基础的计算机上,位于640K和1MB地址边界之间的上位内存块(UMBs)是可供DOS使用的内存块。这些块的个数、容量和位置随安装于该机器中的硬件适配器卡的类型不同而变化很大。
    UMBs可用以存储通常必须位于640K以下的程序、代码和数据。有时被称作“将设备驱动程序装入高端”。

EMBs

    扩展内存块(EMBs)是位于HMA上面的扩展内存,只可以用于存储数据或DOS扩展程序。


虚拟控制程序接口VCPI)和DOS保护模式接口(DPMI)

    其它扩展内存格式使DOS扩展程序的多任务实施变得很容易。多任务DOS扩展程序要求虚拟控制程序接口(VCPI)或DOS保护模式接口(DPMI),因为多任务环境和在该多任务环境下运行的DOS扩展程序两者都使用扩展内存。VCPI和DPMI针对每个程序可如何使用扩展内存而又不与其它程序相冲突而建立更多的标准。

VCPI

    VCPI是一个1987年开发的保护模式规范,它是EMS 4.0规范的超集。VCPI被创立来通过允许需要扩展内存的程序共享扩展内存而避免在这些程序之间的冲突。在XMS之前没有办法使一个程序能确保它所访问的任何内存不正被另一个程序所使用。

    此外,VCPI管理内存分配并在实模式和保护模式之间切换。

    VCPI允许在保护模式下运行的程序与386内存管理程序和在其它保护模式下运行的程序共存。VCPI并不在286机器上工作,因为它不被286硬件支持。VCPI(由一个程序)调用受VCPI服务程序(server)支持,此服务程序通常被包含在扩充内存管理程序中。一个服务程序是一个像饭店服务员一样的程序。它接受来自顾客(一个提出对内存请求的程序)的定单(处于内存调用形式),于是将一块特定的内存给予该程序。假如一个程序进行了VCPI调用,但并未发现一个VCPI服务程序在运行,则该程序就直接接管该计算机硬件,并管理它自己的内存。该程序可直接得到它想要的内存,但没有内存管理程序来调度以防止冲突,因此没有其它的程序可使用该扩展内存。

    DPMI是更新近(1990年)的保护模式接口。VCPI和DPMI之间的区别主要是DPMI进行其工作而不允许应用程序访问CPU的最低层。VCPI却允许任何程序访问CPU的最低层,这意味着没有其它程序(包括操作系统)可同VCPI相抵触。这是一个缺点,因为操作系统的设计师们并不希望程序之间相互干扰。而希望只有操作系统应该能够看到其它程序。

    DPMI也可管理要求保护模式的一个以上的实体,例如若干个正在进行多任务的保护模式程序。此外,DPMI包括一个较新的对于可由保护模式程序进行的 DOS和BI0S调用的编程接口。不像VCPI,DPMI可在286机器上实现,且可跨过多个操作系统,如OS/2和UNIX以及DOS。
    为了向后兼容,一个请求DPMI服务的程序,如果在进行这些调用时未找到DPMI服务程序,则可求助于VCPI服务程序(如果VCPI可供使用)。
   
    注释:对本定义的例外是扩充内存卡。扩充内存卡现在全都废弃了。

    在现在的汇编教科书上,讲完了实模式汇编后就开始讲解保护模式汇编。而保护模式汇编一开始就讲解平坦内存模式、分段内存管理、分页内存管理等诸多概念。使得很多人难以理解。其问题就在于割裂了实模式、保护模式之间的必然联系。通过本篇的讲解,你可以清晰地得到其中的发展主线:
            
      实模式(小内存使用、单任务)---->客户需求、硬件进步---->保护模式(大内存使用、多任务)---->早期阶段 (VCPI、无进程间保护)---->发展阶段(DPMI、有保护措施)---->现今的保护模式方式间的相互关系。


保护模式始于80286

    对于80286,Intel决定以16去乘该最大可访问内存而给予该286以24位的地址总线和最大16兆字节的RAM。但在—个16位的CPU中计算 24位的地址不像再以16去乘该段值那么容易,并且设汁师们想把额外的能力加到寻址功能中去。事实亡CPU必须以完全不同的称为保护模式的方式运行。保护模式不仅给该处理器提供在多个程序正在运行时,保护内存内容的能力,而且还提供更多的内存地址。它使用更复杂的计算实际内存地址的方法。

    CPU运行于保护模式的好处是当若干程序一起共享内存时,每个程序都可被保证其内存空间将不受任何其它程序干扰。

    另一方面.8088和8086运行于实模式它没有任何内存保护。任何程序都可以访问0K和1024K之间的任何内存区域。因为8088和8086均仅有一兆字节的内存可用,故拥有若干程序同时在那里的机会对那些CPu的设计师而言似乎很遥远(不大可能),所以内存保护并不是一个重要功能。为了得到24值的手址。径直以256而不以16去乘该段寄存器似乎很自然。这就使两个寄存器仅重叠8,从而构成24位。
  然而,这不是80286工作的方式,保扩模式需要比径直计算实际地址更多的信息。同样需要些保护信息。保护模式实际使用的方法是让该段寄存器的一部份表示内存中的一张表,它描述该段如何被建立。这张在其中具有针对内存的每一段的项目的表由CPU自动地参考。该表包含有访问权限(读、写,或者只执行),段的大小,关于该内存是否实际存在的信息,以及其它事项。结果仍为24位的实际地址,但计算复杂多了。


80386--划时代的处理器

    80386拥有更多的功能,威力更强。该芯片有32位寄存器,32位的数据总线和32位的地址总。这意味着什么呢?意味着386可访问异常大的4G的 RAM。那就是四千兆字节内存!但访问更多的内存,仅仅才开始。除去这闪存寻址容量之外就是所有附加的操作模式。386不仅支持8026的实模式和 80285的保护恢式,而且它现在工作于自己的32位的保护模式(区别于286的16位保护模式)以及虚拟的8086模式。

    32位保护模式(又称做平坦模型(float model))容许该CPU通过使用16值段值和16位偏移一起作为一个完全的32位地址。
    在现实中,该32位平坦模型使用类似于80286保护模式的描述附表以便提供类似的保护功能。即使如此,16为段和16位偏移有效地描写实际的物理地址这一事实,使在此模式下的变成工作容易许多。本模式还允许CPU在计算机没有足够的物理RAM时使用硬磁盘上的空间作为内存。这种“虚拟内存”允许程序不必关心该计算机中的物理内存的数量而集中于完成它们的任务。在描述符表中的部份信息跟踪物理内存。当计算内存参考时,就检查该描述符以寻找内存。如果不是这种情形,则该磁盘被用以获得正确的内存映射并将它放入实际内存中,于是程序继续运行。当进行得正确时,虚拟内存仅表现为比实际内存稍慢一些,拥有访问远大于该计算机个的实际物理内存的数据区的这个好处,允许运行更大、更强有力的程序。
   
针对DOS的另一种V86模式

    虽然有些程序如AutoCAD,Paradox,OS/2和Microsoft WinDows(增强模式)利用了32位平坦模型来增加内存空间和速度,但DOS程序并不如此,因此该386拥有一种折衷的方法,叫做虚拟8086模式。该模式可仿真一台对正运行于该计算机中的每一个程序具有一兆内存的8086。用虚拟的8086模式,许多实模式程序可以以它们的正常方式执行而实际上则使用在其它情况下不可供它们使用的内存。换句话说,该80386可以分配在RAM中任何地方的1M的内存块,即使该内存处在物理上存在于第一个1024K以外的内存地址中的区域内亦如此,并将每个内存块分配给不同的DOS程序。当一个程序请求处在一个特定地址的内存时,该386内存管理单元(MMU)就检查分配给那个特定程序的地址,并把所请求的地址翻译成实际的物理地址,而该程序并不知道,就象一组8086计算机都同时拥有内存一样。Microsoft wmdows使用该功能以允许DOS程序完成多任务而这些程序却不知道。

总结:
     在早期处理器时(8088,8086)由于硬件条件的限制,软硬件工程师们致力于怎样增加程序的可用内存空间(于是有了扩充内存概念)。到了286 时代出现了INTEL的硬件工程师们研制出了286这个16位寄存器却有24条地址线的怪胎;它可寻址16兆内存(在当时,这可是个巨大的数字)。使得多任务并行成为可能。带来的问题是多任务之间的协调工作问题。于是它被设计为具有保护执行模式的能力。由于其设计的不合理性,使它成为一个昙花一现的产品。
     386的出现具有划时代的意义。它完善了许多286的设计缺陷。并成为INTEL的第一个32位处理器。后来的486、pentium、 pentiumII保持了这个设计架构并陆续加入了超流水线、倍频、超标量等技术。但它们的内存工作模式与386没有任何不同。

2004-2-27 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tdj
银牌会员

论坛候鸟


积分 1131
发帖 332
注册 2003-11-27
状态 离线
『第 2 楼』:  

谢谢!继续!!!!

2004-2-28 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yanrongzhu52
初级用户




积分 141
发帖 8
注册 2004-2-26
状态 离线
『第 3 楼』:  

还好,不错的啊!!继续!

2004-2-28 00:00
查看资料  发送邮件  发短消息 网志  OICQ (187271556)  编辑帖子  回复  引用回复
wenwen
初级用户




积分 105
发帖 1
注册 2004-3-6
状态 离线
『第 4 楼』:  

为什么不继续啊??谢谢了

2004-3-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
snake009x
初级用户




积分 110
发帖 2
注册 2004-3-18
状态 离线
『第 5 楼』:  

好DD继续啊

2004-3-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sfcctv
中级用户





积分 208
发帖 135
注册 2009-9-12
来自 离恨天
状态 离线
『第 6 楼』:  

值得收藏。希望楼主多发些好贴。
向楼主致敬。

2009-10-13 07:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
mwm5
初级用户





积分 40
发帖 23
注册 2009-10-15
状态 离线
『第 7 楼』:  

谢谢分享,收藏了~~

2009-10-18 05:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangfangjian
中级用户





积分 274
发帖 192
注册 2009-1-7
状态 离线
『第 8 楼』:  

好资料 先收藏了

2009-10-18 15:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
4221174
新手上路





积分 18
发帖 9
注册 2009-12-27
状态 离线
『第 9 楼』:  

有点看不懂啊

2010-1-1 20:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
machill
初级用户





积分 37
发帖 14
注册 2008-12-10
状态 离线
『第 10 楼』:  

很好的文章,感谢lz的整理

2010-1-28 15:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ytjdgm
初级用户





积分 76
发帖 23
注册 2010-1-26
状态 离线
『第 11 楼』:  

看不懂

2010-1-28 15:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: