共享使用DLL的时候,DLL实际存放的地址跟进程调用的地址是不一样的。
如有一个DLL-A,两个进程B, C. B&C都调用DLL,那么运行B的时候,B有
一个具体存放的地方,调用A时,系统把A调进内存,存放的地方不是在B的
4G内存地址空间内。C也相同。看下图:
DLL A:
======0xFFF000=======
......
======0xFFFFFF=======
B:
======0x3FF000=======
...
//调用A的地址
==0x3FFcc0===
...
======0x3FFFFF=======
C:
======0x8FF000=======
...
//调用A的地址
==0x8FFcc0===
...
======0x8FFFFF=======
而实际上,
B&C调用的A的实际地址只有一个!!!上图的调用地址(0x3FFcc0, 0x8FFcc0)指向的具体
物理地址是相同,只不过映射到具体进程中的地址不同而已。
理解的不是很透彻,阐述的也不是很明白,不过大致的原理应该没错。