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毫秒