社区
进程/线程/DLL
帖子详情
当dll被不同的进程加载时。。。
yoci
2000-06-22 05:39:00
有个问题一直不懂:dll被不同的进程加载时,它在各进程中的逻辑地址是不是相同的?
如果是相同的,那怎么保证这个地址不被别的dll给占用呢?难道要预留出来?比如mfc42.dll是固定加载在每个进程地址的0x5f400000处。
如果是不同的,那么dll的代码被不同的进程加载到不同的页面(应该是这样的吧?),当共享的代码运行到页与页的交界处,它怎么该往什么跳转?
...全文
288
4
打赏
收藏
当dll被不同的进程加载时。。。
有个问题一直不懂:dll被不同的进程加载时,它在各进程中的逻辑地址是不是相同的? 如果是相同的,那怎么保证这个地址不被别的dll给占用呢?难道要预留出来?比如mfc42.dll是固定加载在每个进程地址的0x5f400000处。 如果是不同的,那么dll的代码被不同的进程加载到不同的页面(应该是这样的吧?),当共享的代码运行到页与页的交界处,它怎么该往什么跳转?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
我也想知道
DLL
木马
进程
内幕大揭密
DLL
木马
进程
,很不错的一本书
dll
加
载
卸
载
工具源码
远程注入方式实现LoadLibrary,FreeLibrary 附带遍历
进程
和模块
dll
功能。svchost等的系统
进程
不能遍历,没做处理。 用了破解的皮肤组件,360之类的软件可能会唧唧歪歪,不喜欢的可以自行修改代码和删除相关皮肤文件的调用。
DLL
动态库多次
加
载
问题
原因涉及
DLL
加
载
和运行机制,主要有两点:1)
DLL
动态链接库无法独立运行,必须由一个应用程序
进程
加
载
到
进程
空间后才能使用。
加
载
DLL
的
进程
称为宿主
进程
。被
加
载
的
DLL
属于宿主
进程
,不属于宿主
进程
内某个线程。2)宿主
进程
可以重复调用,甚至重复
加
载
DLL
。第1次调用
DLL
或第1次
加
载
DLL
时
,宿主
进程
将
DLL
引入
进程
空间。一旦宿主
进程
成功
加
载
DLL
,随后的重复调用或重复
加
载
只会增
加
“引用计...
DLL
入门浅析 - 多
进程
加
载
DLL
内存模型
DLL
入门浅析(5)——使用
DLL
在
进程
间共享数据 在Win16环境中,
DLL
的全局数据对每个
载
入它的
进程
来说都是相同的,因为所有的
进程
用的都收同一块地址空间;而在Win32环境中,情况却发生了变化,每个
进程
都有了它自己的地址空间,
DLL
函数中的代码所创建的任何对象(包括变量)都归调用它的
进程
所有。当
进程
在
载
入
DLL
时
,操作系统自动把
DLL
地址映射到该
进程
的私有空间,也就是
动态
加
载
dll
的问题(同一个
进程
使用
dll
的解决办法)
今天项目需要进行同一个
dll
的多线程同
时
操作。 解决办法 :通过动态
加
载
的办法 将
dll
复制重命名 即 线程A-----复制test.
dll
并重命名为test_A.
dll
--动态
加
载
test_A.
dll
线程B-----复制test.
dll
并重命名为test_B.
dll
--动态
加
载
test_B.
dll
//现在
dll
中的函数为 DWORD WINAPI SUP300_Open(_Out_ HANDLE* hHandle, _In_ int ControlT...
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章