windows下还允许直接存取内存地址吗,有没有相应的函数??

Kerrie 2000-07-23 09:11:00
...全文
307 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhzzr 2000-07-24
  • 打赏
  • 举报
回复
我也想直接访问物理内存,我找到这样一篇文章,但我也没看明白,给你看看,看后我们再讨论


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
david_jts 2000-07-24
  • 打赏
  • 举报
回复
汇编杂志和电脑编程与维护有介绍如何进入Rong0。
guojin 2000-07-24
  • 打赏
  • 举报
回复
一般应用程序 是处于用户态(ring3),不能直接读取内存,只能操作虚拟内存.
如果你要直接操作内存,必须是处于核心态(ring0),可用VxD来实现.
halfdream 2000-07-23
  • 打赏
  • 举报
回复
在WINDOWS中是32位保护模式,同实模式不同,用户程序不能直接访问物理内存,
用户程序访问的是虚拟内存,而且每个进程的地址空间都是独立的。
zhq2000 2000-07-23
  • 打赏
  • 举报
回复
线性内存可通过WDM直接存取。
cqjiang 2000-07-23
  • 打赏
  • 举报
回复
什么内存?线性内存在Win32是不能直接存取的。
zhq2000 2000-07-23
  • 打赏
  • 举报
回复
用VirtualProtectEx,ReadProcessMemory,WriteProcessMemory!
本课程目前总计105课时,并且不定期的进行新知识点的补充,目的是打造一部围绕MySQL的全体系课程。课程涵盖11大章节,分别是:第1章基础&技巧:这部分的重点是会讲解一些容易被开发人员忽略的技巧,例如utf8mb4字符集问题、如何使用外部临时表提高查询效率、快速创建同结构表及快速复制数据、截断表和删除数据使用和差异、以及怎样使用help语句查看帮助文档。第2章六大数据类型:这部分的重点是对MySQL的8种数字类型、5种日期和时间类型、10种字符串类型、枚举类型、集合类型和时间戳类型的区别和使用进行深入讲解。第3章数据库函数大全:MySQL中有上百种函数之多,使用函数可以快速的解决我们很多开发问题,但是由于我们掌握的函数不够多,往往没有办法实际应用,本章节重点是让你掌握更多好用而你不知道的函数使用。第4章数据库引擎精讲:本章节带您深入到MySQL的体系架构,深入理解innoDB、MyISAM、MEMORY、ARCHIVE引擎的区别和使用原则。第5章数据库索引精讲:索引是保障我们查询效率的重点,本章节从逻辑存储和物理存储的底层入手,深入剖析索引的存储结构和查找方法,掌握聚簇索引、非聚簇索引、前缀索引等的存取原理和使用技巧。第6章调优工具:工欲善其事必先利其器,本章节带你掌握读写比例查询、缓存设置、执行计划和Profile调优工具。第7章参数调优和索引调优:怎么样让SQL执行的更快、数据库的性能更强,怎样充分利用索引进行不断的优化。本章节会为您讲解16种MySQL的优化策略。第8章SQL调优:SQL语句是我们日常使用的重点,怎么样写出一手高性能的SQL语句,其实是具有一定技巧的,本章节讲解8种优化策略,让数据SQL执行性能更强。第9章分库分表:在面对海量数据的时候单表和单个数据库的性能始终会存在瓶颈,本章节为您讲解分库分表的原理和技巧,怎么样使用Merge引擎分表、深入掌握MySQL数据库分区表的能力。第10章高可用架构和安全管理:本部分涵盖MySQL的高可用架构,主备架构、主从架构、主从从架构、互为主从架构。数据的同步复制、半同步复制、异步复制。主从复制原理和主从延迟的问题,以及在管理和开发层面怎样保证数据库安全。第11章MySQL日志:对MySQL的7种日志进行讲解,包括errorlog错误日志、general log查询日志、slow log慢日志、binlog 二进制日志、redlog重做日志。课程会附带配套文档和SQL脚本。有问题可以直接联系作者,24小时线上答疑。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧