Windows 版 (精华区)
发信人: liujq (qiangqiang), 信区: OS
标 题: Re: 请教—如何在WIN95下直接访问物理内存
发信站: 紫 丁 香 (Thu Aug 20 20:14:09 1998), 转信
【 在 ldm (mumu) 的大作中提到: 】
: 在win95下,如何对内存中的某一地址直接进行读写操作?
: 本人急待解决这一问题,事关重大,恳请各位有识之士不吝赐教!
Windows 95工作在32位保护模式下,因此,要想在Windows 95下直接访问物理内存,
应按以下两个步骤进行:
1. 确定所要访问的物理内存所对应的段选择符(Selector),段选择符在保护模式下所起
的作用,相当于段地址在实模式下所起的作用;
2. 根据(1)所得到的段选择符以及它所对应的基地址,确定所要访问的物理内存的偏移
量,从而达到直接访问物理内存的目的.
下面给出上述两步骤的一些具体技术细节.
1. 一般说来,要求直接访问的物理内存都与实模式下能够寻址的内存有关(即DOS能直接
访问的1M物理内存).对于这1M内存,Windows 95对常用的内存段都定义了相应的段选择
符,如下:
1007 -- 00000C90 102F -- 000B0000
100F -- 00000000 1037 -- 000B8000
1017 -- 00000400 103F -- 000C0000
101F -- 000F0000 1047 -- 000D0000
1027 -- 000A0000 104F -- 000E0000
这些段选择符对应的内存限长均为0XFFFF,即64K.
从程序运行的健壮性考虑,不应该直接应用上述段选择符,而应该用
GetThreadSelectorEntry()函数得到欲访问物理内存对应的段选择符.
在确定段选择符时应注意,所选的段选择符的请求特权级为3级(应用程序级),并且
存放于LDT(局部描述符表)中,即具有如下格式:
15 3 2 1 0
+------------+---+-----+
| INDEX | 1 | 1 1 |
+------------+---+--+--+
| |
| +-- 请求特权级 (00--操作系统 11--应用程序)
+-- 标志段选择符在GDT还是LDT中 (0--GDT 1--LDT)
2. 把得到的段选择符置于相应的段寄存器中(不能用CS,DS),用该寄存器进行数据访问.
比如,要向地址为D000:0080的物理内存写一个字节,从D000:0081读一个字节,可用
如下代码实现:
...
WORD wSelector;
BYTE byRead, byWrite;
... // 获取基地址为000D0000的段选择符, 置于wSelctor中
_asm {
push es
// 段选择符放入段寄存器中
mov ax,wSelector
mov es,ax
// 写内存
mov ebx,0X00000080
mov al,byWrite
mov byte ptr es:[ebx],al
// 读内存
inc ebx
mov al,byte ptr es:[ebx]
mov byRead,al
pop es
}
以上仅为个人见解,与各位讨论,希望对有这方面需求的朋友有一定帮助.
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: alioth.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.246毫秒