下面这段内容摘自<<Windows 核心编程>>第301页:    13.2.3用户方式分区--适用于Windows 2000和Windows 98
    这个分区是进程的私有(非共享)地址空间所在的地方.一个进程不能读取,写入,或者以任何方式访问驻留在该分区中的另一个进程的数据.对于所有应用程序来说,该分区是维护进程的大部分数据的地方.由于每个进程可以得到它自己的私有的,非共享分区,以便存放它的数据,因此应用程序不太可能被其他应用程序所破坏,这使得整个系统更加健壮.
    Windows 2000 在Windows 2000中,所有的.exe和DLL模块均加载这个分区.每个进程可以将这些DLL加载到该分区的不同地址中(不过这种可能性很小).系统还可以在这个分区中映射该进程可以访问的所有内存映射文件.    我想问的问题有以下几条:
    (1.1)"所有的.exe和DLL模块均加载这个分区"中的"加载"具体来说是什么意思,是不是和"映射"是同一个概念?
    (1.2)"所有的.exe和DLL模块均加载这个分区"这句话是不是应该改写为"所有的.exe和DLL模块均加载到这个分区"比较好理解.注意后者比前者多了一个"到"字.
    (3.1)"不过这种可能性很小"指的是哪种可能性,指的是"每个进程可以将这些DLL加载到该分区的不同地址中"这种可能性吗?
    (3.2)请您谈谈"每个进程可以将这些DLL加载到该分区的不同地址中"这个操作究竟做了哪些具体的事情.
    (3.3)这种可能性怎么会比较小呢,麻烦您说说具体的原因.    麻纺高手帮我解释一下;感兴趣的朋友帮我顶一下.

解决方案 »

  1.   

    Windows 核心编程看过很久了,有些都忘了,妄自猜测,不要笑我
    1 我觉的是把exe or dll文件直接拷贝到首地址指定的进程虚拟地址上exe好像是0x40000000上,DLL好像是0xf0000000(默认)上,记不太清楚了2(1.2)"所有的.exe和DLL模块均加载这个分区"这句话是不是应该改写为"所有的.exe和DLL模块均加载到这个分区"比较好理解.注意后者比前者多了一个"到"字.
    我不知道你是不是看错了,我记得exe dll是加载在不同区域的,DLL在系统地址空间中
    (3.2)请您谈谈"每个进程可以将这些DLL加载到该分区的不同地址中"这个操作究竟做了哪些具体的事情.
    首先看默认的加载地址是否被别的DLL占用,如果没有,那就应该先把DLL文件首先拷贝到这个地址为首地址的空间上,然后操作系统会做另外的一些工作,如果默认地址被占用,操作系统还要在系统内存空间找到新的空间加载dll,为此还要计算一个偏移地址,提供给dll使用,dll编译时提供了这个选项,具体Windows 核心编程讲的应该很清楚,(3.1)"不过这种可能性很小"指的是哪种可能性,指的是"每个进程可以将这些DLL加载到该分区的不同地址中"这种可能性吗?
    这是说EXE DLL一般都可以加载到自己默认的地址上(exe好像是0x40000000上,DLL好像是0xf0000000(默认)上,记不太清楚了)(3.3)这种可能性怎么会比较小呢,麻烦您说说具体的原因.
    每个进程一般都只有一个EXE,因此exe没有理由加载到非默认的地址空间,dll一般都是系统dll,如USER.DLL,这些DLL有自己指定的地址,只是如果exe要使用自己的多个dll,时才会抢地址,当dll被架载在非默认地址时,就必须使用偏移地质才能正常运行,如
    JMP 0xf2001234就会变成JMP 0xf2001234+offaddr;offaddr为偏移地址,具体Windows 核心编程上有优化的方法,如修改DLL的默认基地址
      

  2.   

    非常非常感谢athlonxpx86(一滴水)对我的帮助,真的非常感谢.
    对此问题感兴趣的朋友,请继续发表您的高见.