一个DLL可以被映射到两个进程的虚拟地址的不同的虚拟地址上吗?如果这要做,会出现什么问题? 这些问题可以解决吗?如果不能,怎么排除这个问题。这是答案:If a DLL starts out with BR 100 instruction and this DLL is mapped to address
1000 in one process and address 2000 in another process, it will fail in both of
them. One way out is to make sure all the code in all DLLs is position
independent. Another way is to give each DLL a unique virtual address and
have it always map there. Finally, on a segmented architecture, each DLL
can be put in a separate segment谁帮我解释一下,不是解释英文的意思,英文我看得明,是解释具体的意思是什么谢谢

解决方案 »

  1.   

    当然可以,如果这个DLL的RefBaseAddress已经被其他DLL占用的话,就只能选择其他的基地址。
    这样的话,DLL reloc段里的所有内容在DLL加载的时候会根据新的DLL加载地址改写
      

  2.   

    BR 100 instruction这个指的什么?看起来像是实模式相关的????Finally, on a segmented architecture, each DLL can be put in a separate segment.
    分段寻址结构上,每个dll都能被映射到各自的段上??????????看不懂啊.....
    win32每个进程都有自己的用户态地址,A进程将DLL映射到地址a, B进程将DLL映射到地址b,是没有什么关系的.....
    lz书名叫什么啊??
      

  3.   

    DLL被两个进程映射,地址不一样这是没问题的。进程之间互不影响,Windows能保证这个。
      

  4.   

    一个DLL可以被映射到两个进程的虚拟地址的不同的虚拟地址上吗?如果这要做,会出现什么问题? 这些问题可以解决吗?如果不能,怎么排除这个问题。
    ========================
    Windows两个进程之间并没什么任何关系,它们的地址空间是没有隔离开的,同一个DLL被映射到不同的进程的两个不同虚拟地址是可以的。一般不会出现问题
      

  5.   

    当然可以了。windows为了不让进程之间相互影响,对于进程的保护的相当严格的。如果你想通过一个进程去控制另一个进程或者去访问其中的资源,也是相当麻烦的,除非你刻意的去这么做,否则两者是不可能发生冲突的。我们通过所谓的指针其实就是通过虚拟地址来访问进程中的资源,而这个虚拟地址是针对每个进程的独有的,当你用这个地址在另一个进程中去调用,要么就是非法访问(类型不匹配或NULL),要么就是返回的另外一个未知资源。
    如果两个进程都加在同一个DLL(COM中用的特别多),这两个DLL被映射到两个进程的两个虚拟内存地址中。我们只能操作虚拟地址,windows通过内部的算法转换(段的重定位),就知道我们是访问的哪个资源,我们无法直接的操作实际的内存地址或者硬盘的数据。因此,这就保护了进程不会出现误操作而破坏其他的进程资源。当然,也有例外。比如DLL中有一个全局变量,当这个内存被映射到两个进程中,其中一个进程操作它使他变化时,那么另外一个进程得到的就是修改后的数值了,这样就出现一个进程控制另一个进程的情况发生。不过,这种事一般是你所希望的。