当dll被不同的进程加载时。。。

yoci 2000-06-22 05:39:00
有个问题一直不懂:dll被不同的进程加载时,它在各进程中的逻辑地址是不是相同的?
如果是相同的,那怎么保证这个地址不被别的dll给占用呢?难道要预留出来?比如mfc42.dll是固定加载在每个进程地址的0x5f400000处。

如果是不同的,那么dll的代码被不同的进程加载到不同的页面(应该是这样的吧?),当共享的代码运行到页与页的交界处,它怎么该往什么跳转?
...全文
279 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoci 2000-06-24
  • 打赏
  • 举报
回复 1
虽然我没看懂,但还是十分感激你的回答。
谢谢指点。
jy 2000-06-22
  • 打赏
  • 举报
回复
首先,定位的基址并不是绝对固定的。这取决于具体的一个进程的内存的使用情况,操作系统能够依据具体情况而调整一个DLL的映射地址,又叫做基址的重定位(rebase)。当调试一个程序时,你可以看到调试信息中的Load和Rebase DLL的信息输出。

常见的动态库,我特别指那些由系统安装自带的或者特定硬件子系统的用到的DLL,由MS以一种预定义的方式约定了加载基址,目的是避免花费额外的系统开销,每次重定位过程实际上是一种运行时连接(LINK)技术。所以,作为M$的推荐,用户的DLL基址通常从0x10000000开始。

关于后一个说法,你的概念极其不明晰。只能讲成是:DLL的代码被不同的进程加载到不同的逻辑地址处。并且,绝大多数情况下我们可以说成是:加载到同一逻辑地址处。进程完全不知道这些代码会被分布在那一或者几段物理页面上。对于一个进程而言,它所得到的始终是一个4GB的连续寻址的地址空间,即逻辑地址。

从Windows来说,一个DLL的代码被加载到一个内存映射文件中。

至于页与页的交界处的问题,属于操作系统的问题,并结合硬件机制予以完成。草草地说,CPU支持被操作系统所操纵的一种从逻辑地址到物理地址之间的转换算法,这样,当运行到页边界时,CPU能够发出一个缺页失败,这也是能由OS所能截获的异常(Exception),这时,OS的中心任务是找出下一页代码在文件系统中的位置,并加载它到内存中,映射,继续执行。

所以,共享的代码是不知道下一步该往哪里跳转的。

OK,可怜我的手!

yoci 2000-06-22
  • 打赏
  • 举报
回复
不好意思,最后一句写错了
应该是:
当共享的代码运行到页与页的交界处,它怎么知道该往什么页跳转?
leslielu 2000-06-22
  • 打赏
  • 举报
回复
我也想知道

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧