⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 05o014.htm

📁 VC知识库5_chm_decompile_20040520_210715
💻 HTM
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>

<body>

<div align="justify">
  <table border="0" width="100%" class="font" height="57">
    <tr>
      <td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
      <font color="#800080">VC知识库(五)</font>
      </td>
      <td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
      <font color="#800080">www.vckbase.com</font>
      </td>
    </tr>
    <tr>
      <td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
      <hr>
      </td>
    </tr>
    <tr>
      <td width="100%" height="17" class="header" valign="top" align="center" colspan="2">

<p align=center><big>Windows95下物理内存单元的可靠读写</big></p>
      </td>
    </tr>
    <tr>
      <td width="100%" height="17" class="info" align="center" colspan="2">
      李为民 付 强 何松华<br> 
        (国防科技大学电子工程学院ATR室 长沙 
        410073) 
      </td>   
    </tr>   
    <tr>  
      <td width="100%" height="22" class="font" colspan="2"> 
        <hr> 
      </td>   
    </tr>  
    <tr>  
      <td width="100%" height="5" class="font" colspan="2">  
        <br> 
        摘 要:本文介绍了Windows95下处于保护模式下的内存寻址模式和保护模式下的虚<br> 
        拟8086<br> 
        内存寻址模式,给出了可靠地进行物理内存单元读写的例程。<br> 
        关键词:Windows编程 内存寻址 保护模式 V86模式<br> 
        <br> 
        1.引言<br> 
        计算机运行于DOS平台下时,内存寻址模式为实模式,采用80286的20位地址线的存<br> 
        储器分页线性管理技术,存储器容量最大为1MB,线性地址与物理地址一致,对物理<br> 
        内存单元读写直接、灵活。但因受限于640K基本内存,使大量的扩展内存的使用受<br> 
        到制约,同时,分页的64K范围限制影响了内存访问的连续性,从而使系统的内存资<br> 
        源难以得到充分利用。<br> 
        计算机运行于Windows95保护模式下时,由于系统或系统中的驱动程序兼容性不好等<br> 
        原因,系统可能处于两种内存寻址模式之一:或是保护模式下的内存寻址模式,或<br> 
        是保护模式下的虚拟8086内存寻址模式(V86模式)。对于这两种模式,要实现对物理<br> 
        内存单元的读写,方法截然不同。我们在运行含有进行内存读写的Windows程序时,<br> 
        常常因为不清楚系统目前处于何种寻址模式而导致访问失败,因此有必要对此进行<br> 
        一番探讨。<br> 
        <br> 
        2.保护模式下的内存寻址模式<br> 
        当CPU运行于分段管理的保护模式下时,可利用其32位地址线提供4G字节地址访问空<br> 
        间的虚拟存储器,通过特权位和界限值的检查实现完整的保护功能。此时,Windows<br> 
        的内存被全局描述符表(GDT)和局部描述符表(LDT)所控制,并以选择器(Selector)<br> 
        的方式供程序使用。每一个段的说明都对应描述符表中的一项,称为一个段描述符,<br> 
        分别对应一个相应的物理内存段。每个段描述符都由三个参数来构成:段基址<br> 
        (Base)规定线性地址空间的开始地址;段界限(Limit)表示段内的最大偏移量;保护<br> 
        属性(Property)表示此段的一些特征。物理内存访问的远指针由选择器<br> 
        (Selector):偏移量(Offset)构成,这里的selector不象实模式寻址那样代表某个<br> 
        段寄存器的真实地址,而是用来确定段描述符在描述符表中的入口地址,描述符表表<br> 
        中相应位置所存的数据内容才是其真正的物理内存地址。在没有分页的情况下(分页<br> 
        情况由Property来决定),将段描述符的Base左移16位再加上Offset的值就形成了32<br> 
        位内存物理地址。<br> 
        保护模式下的这种寻址模式打破了实模式下内存寻址所受到的制约,提高了内存资源<br> 
        的使用效率。<br> 
        3.保护模式下的V86模式<br> 
        为了使DOS实模式应用程序无需修改就可以在Windows95保护模式下直接运行,系统<br> 
        提供了V86模式。它与实模式下的内存寻址模式非常相似,提供了段内线性分页管理<br> 
        技术,由段的属性部分控制分页特征。当系统进入V86模式后,在应用程序中对物理<br> 
        内存单元的读写方法与DOS实模式下完全相同。当在保护模式方式下运行DOS实模式<br> 
        下的应用程序时,Windows的虚拟机器管理器(VMM)就创建一个虚拟的8086机器,它<br> 
        仿真了全部的8086处理器,包括内存、I/O设备和所有在启动Windows时运行着的<br> 
        TSR、设备驱动程序以及网络软件,以便使该应用程序在其上运行,执行完应用程序<br> 
        后再重新恢复原来的保护模式。值得注意的是,尽管V86模式下运行了DOS实模式的<br> 
        程序代码,但并不是和实模式相似的方式运行,而是和保护模式相似的方式运行,<br> 
        所以说V86模式实质是一种能运行实模式软件的保护模式。<br> 
        如果系统正处于V86模式,那么使用保护模式下的内存寻址模式就无法读写物理内存<br> 
        单元,而必须用实模式下的内存寻址模式来进行读写。在Windows95下你可以查看<br> 
        “控制面板|系统|性能”页,如果看到“驱动器C:正在使用兼容的分页存储技术”<br> 
        、“兼容的分页存储技术降低了整个系统性能”的信息,就表示系统正处于V86模<br> 
        式;如果看到的是“您的系统是按照最优性能配置的”的信息,则表示系统正处于<br> 
        保护模式下的内存寻址模式。<br> 
        <br> 
        4.Windows95下物理内存单元的可靠读写<br> 
        由于上述原因,我们在编写Windows95下内存读写程序时,必须兼顾两种寻址模式,<br> 
        使得程序不仅在真正的保护模式下能运行,在系统处于V86模式时也能正常运行,以<br> 
        提高程序运行的可靠性。下面是程序的主要代码:<br> 
        (<br> 
        LONG FAR PASCAL _export WndProc(HWND hWnd,UNIT Message,<br> 
        WPARPAM wParam,LPARAM lParam)<br> 
        {<br> 
        unsigned int i;<br> 
        char far *pt; //内存单元读写指针<br> 
        UINT Selector1,Selector2; <br> 
        WORD Segment,Offset,Start; <br> 
        DWORD Base,Limit; <br> 
        BOOL flag; <br> 
        flag=TRUE;<br> 
        char Test[10]; <br> 
        switch(Message)<br> 
        {<br> 
        case WM_CREATE:<br> 
        __asm move Selector1,DS; //将数据段寄存器DS作为模板<br> 
        Selector2=AllocSelector(Selector1); //分配一个新选择器<br> 
        if(Selector2==NULL) //保护模式失败<br> 
        {<br> 
        flag=FALSE; <br> 
        pt=(char far*)0xD000; //V86模式下的指针<br> 
        }<br> 
        else<br> 
        {<br> 
        Segment=0xD000; //访问的物理段基址<br> 
        Offset=0x0100; //访问界限<br> 
        Start=0x0000; //访问偏移起始地址<br> 
        Base=((unsigned long)Segment)&lt;&lt;4|Start;//形成基地址<br> 
        Limit=(unsigned long)Offset-1; //形成访问界限值<br> 
        SetSelectorBase(Selector2,Base); //设置物理起始地址<br> 
        SetSelectorLimit(Selector2,Limit); //设置物理访问界限<br> 
        pt=(char far*)(((unsigned 
        long)selector2)&lt;&lt;16)|Start);<br> 
        } //形成保护模式下的远指针<br> 
        for(i=0;i&lt;10;i++)<br> 
        *pt++=i; //用pt进行写操作<br> 
        pt--;<br> 
        for(i=10;i&gt;0;i--)<br> 
        Test[i]= *pt--; //用pt进行读操作 <br> 
        break;<br> 
        (<br> 
        case WM_DESTROY:<br> 
        if(flag==TRUE)<br> 
        FreeSelector(Selector2); //释放选择器<br> 
        PostQuitMessage(0);<br> 
        break;<br> 
        (<br> 
        }<br> 
        } <br> 
        <br> 
        5.结束语<br> 
        以上介绍的主要内容是对保护模式下的物理内存单元读写失败后,自动转入到DOS实<br> 
        模式进行读写,提高了程序运行的可靠性。Windows下的物理内存单元读写用途十分<br> 
        广泛,如直接读写BIOS数据区、直接对视频缓冲区操作、数据I/O板的扩展地址存取<br> 
        以及与DOS的TSR程序通信等等。值得注意的是,在使用时一定要小心,必须保证指<br> 
        针指向一个有效的、固定的内存块,且操作不能越出界限,以免带来麻烦;还有, 
        <br> 
        对指定的内存操作完毕后,切莫忘记释放对应的选择器,以释放所占用的内存资<br> 
        源。<br> 
        <br> 
        <br> 
        主要参考资料:<br> 
        ?.Andrew Schulman ,“Unauthorized Windows”,IDG Books 
        Worldwide ,Inc.,1994<br> 
        ?Adrian King,“Inside Windows95”, Microsoft Press,1994  
      </td>     
    </tr>    
    <tr> 
      <td width="100%" height="12" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr> 
      <td width="100%" height="6" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr> 
      <td width="100%" height="8" class="font" colspan="2">  
      </td>     
    </tr> 
    <tr>    
      <td width="100%" height="17" class="font" colspan="2"></td>     
    </tr>    
  </table>     
</div>     
     
</body>     
     
</html>     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -