分享
 
 
 

Windows95下物理内存单元的可靠读写(通过选择器方法)与上一篇不同

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Windows95下物理内存单元的可靠读写

李为民 付 强 何松华

(国防科技大学电子工程学院ATR室 长沙 410073)

摘 要:本文介绍了Windows95下处于保护模式下的内存寻址模式和保护模式下的虚

拟8086

内存寻址模式,给出了可靠地进行物理内存单元读写的例程。

关键词:Windows编程 内存寻址 保护模式 V86模式

1.引言

计算机运行于DOS平台下时,内存寻址模式为实模式,采用80286的20位地址线的存

储器分页线性管理技术,存储器容量最大为1MB,线性地址与物理地址一致,对物理

内存单元读写直接、灵活。但因受限于640K基本内存,使大量的扩展内存的使用受

到制约,同时,分页的64K范围限制影响了内存访问的连续性,从而使系统的内存资

源难以得到充分利用。

计算机运行于Windows95保护模式下时,由于系统或系统中的驱动程序兼容性不好等

原因,系统可能处于两种内存寻址模式之一:或是保护模式下的内存寻址模式,或

是保护模式下的虚拟8086内存寻址模式(V86模式)。对于这两种模式,要实现对物理

内存单元的读写,方法截然不同。我们在运行含有进行内存读写的Windows程序时,

常常因为不清楚系统目前处于何种寻址模式而导致访问失败,因此有必要对此进行

一番探讨。

2.保护模式下的内存寻址模式

当CPU运行于分段管理的保护模式下时,可利用其32位地址线提供4G字节地址访问空

间的虚拟存储器,通过特权位和界限值的检查实现完整的保护功能。此时,Windows

的内存被全局描述符表(GDT)和局部描述符表(LDT)所控制,并以选择器(Selector)

的方式供程序使用。每一个段的说明都对应描述符表中的一项,称为一个段描述符,

分别对应一个相应的物理内存段。每个段描述符都由三个参数来构成:段基址

(Base)规定线性地址空间的开始地址;段界限(Limit)表示段内的最大偏移量;保护

属性(Property)表示此段的一些特征。物理内存访问的远指针由选择器

(Selector):偏移量(Offset)构成,这里的selector不象实模式寻址那样代表某个

段寄存器的真实地址,而是用来确定段描述符在描述符表中的入口地址,描述符表表

中相应位置所存的数据内容才是其真正的物理内存地址。在没有分页的情况下(分页

情况由Property来决定),将段描述符的Base左移16位再加上Offset的值就形成了32

位内存物理地址。

保护模式下的这种寻址模式打破了实模式下内存寻址所受到的制约,提高了内存资源

的使用效率。

3.保护模式下的V86模式

为了使DOS实模式应用程序无需修改就可以在Windows95保护模式下直接运行,系统

提供了V86模式。它与实模式下的内存寻址模式非常相似,提供了段内线性分页管理

技术,由段的属性部分控制分页特征。当系统进入V86模式后,在应用程序中对物理

内存单元的读写方法与DOS实模式下完全相同。当在保护模式方式下运行DOS实模式

下的应用程序时,Windows的虚拟机器管理器(VMM)就创建一个虚拟的8086机器,它

仿真了全部的8086处理器,包括内存、I/O设备和所有在启动Windows时运行着的

TSR、设备驱动程序以及网络软件,以便使该应用程序在其上运行,执行完应用程序

后再重新恢复原来的保护模式。值得注意的是,尽管V86模式下运行了DOS实模式的

程序代码,但并不是和实模式相似的方式运行,而是和保护模式相似的方式运行,

所以说V86模式实质是一种能运行实模式软件的保护模式。

如果系统正处于V86模式,那么使用保护模式下的内存寻址模式就无法读写物理内存

单元,而必须用实模式下的内存寻址模式来进行读写。在Windows95下你可以查看

“控制面板|系统|性能”页,如果看到“驱动器C:正在使用兼容的分页存储技术”

、“兼容的分页存储技术降低了整个系统性能”的信息,就表示系统正处于V86模

式;如果看到的是“您的系统是按照最优性能配置的”的信息,则表示系统正处于

保护模式下的内存寻址模式。

4.Windows95下物理内存单元的可靠读写

由于上述原因,我们在编写Windows95下内存读写程序时,必须兼顾两种寻址模式,

使得程序不仅在真正的保护模式下能运行,在系统处于V86模式时也能正常运行,以

提高程序运行的可靠性。下面是程序的主要代码:

(

LONG FAR PASCAL _export WndProc(HWND hWnd,UNIT Message,

WPARPAM wParam,LPARAM lParam)

{

unsigned int i;

char far *pt; //内存单元读写指针

UINT Selector1,Selector2;

WORD Segment,Offset,Start;

DWORD Base,Limit;

BOOL flag;

flag=TRUE;

char Test[10];

switch(Message)

{

case WM_CREATE:

__asm move Selector1,DS; //将数据段寄存器DS作为模板

Selector2=AllocSelector(Selector1); //分配一个新选择器

if(Selector2==NULL) //保护模式失败

{

flag=FALSE;

pt=(char far*)0xD000; //V86模式下的指针

}

else

{

Segment=0xD000; //访问的物理段基址

Offset=0x0100; //访问界限

Start=0x0000; //访问偏移起始地址

Base=((unsigned long)Segment)<<4|Start;//形成基地址

Limit=(unsigned long)Offset-1; //形成访问界限值

SetSelectorBase(Selector2,Base); //设置物理起始地址

SetSelectorLimit(Selector2,Limit); //设置物理访问界限

pt=(char far*)(((unsigned long)selector2)<<16)|Start);

} //形成保护模式下的远指针

for(i=0;i<10;i++)

*pt++=i; //用pt进行写操作

pt--;

for(i=10;i>0;i--)

Test[i]= *pt--; //用pt进行读操作

break;

(

case WM_DESTROY:

if(flag==TRUE)

FreeSelector(Selector2); //释放选择器

PostQuitMessage(0);

break;

(

}

}

5.结束语

以上介绍的主要内容是对保护模式下的物理内存单元读写失败后,自动转入到DOS实

模式进行读写,提高了程序运行的可靠性。Windows下的物理内存单元读写用途十分

广泛,如直接读写BIOS数据区、直接对视频缓冲区操作、数据I/O板的扩展地址存取

以及与DOS的TSR程序通信等等。值得注意的是,在使用时一定要小心,必须保证指

针指向一个有效的、固定的内存块,且操作不能越出界限,以免带来麻烦;还有,

对指定的内存操作完毕后,切莫忘记释放对应的选择器,以释放所占用的内存资

源。

主要参考资料:

?.Andrew Schulman ,“Unauthorized Windows”,IDG Books Worldwide ,Inc.,1994

?Adrian King,“Inside Windows95”, Microsoft Press,1994

| 返回目录 |

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有