[DLL]dll的小问题

xujungood 2004-09-18 05:36:56
比如说kernel32.dll,每个进程都要用到他,
那么是在每个进程的地址空间中加载这个DLL,还是整个系统中就1个KERNEL32。DLL,其他进程通过指针指向这个DLL?

...全文
244 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujungood 2004-10-10
  • 打赏
  • 举报
回复
DLL的映射是不是逻辑上的映射?只是把DLL页映射到进程的4G空间,每个进程访问实际物理内存的时候还是访问相同的物理内存
yonk 2004-10-03
  • 打赏
  • 举报
回复
dll只在需要的时候被载入到进程空间中。当然,也可以在一开始就载入所有的DLL库。一般情况下却是在运行时发生的。
xujungood 2004-10-03
  • 打赏
  • 举报
回复
xujungood 2004-09-30
  • 打赏
  • 举报
回复
xujungood 2004-09-27
  • 打赏
  • 举报
回复
但是每个进程映射的DLL的虚拟地址空间都可能是不同的,在挂接API的时候,是从自己进程中得到某个函数的虚拟地址空间,然后根据这个地址到目标进程中去找那个函数。如果这两个进程映射DLL的地址不同的话,就不能这样做的啊!~
kugou123 2004-09-24
  • 打赏
  • 举报
回复
怎么会?DLL的好处是节省代码量,为重复开发提供方便,但是如果多个程序使用该DLL,它确实是在每个进程中都被加载的,举个简单的例子,像全局钩子就是,你的DLL会被插入到系统每个进程的空间中。
而且每个进程虚拟空间为4GB,其中有2个GB是供系统使用的,应该足够加载所需要的一切DLL了,我想KERNEL32.DLL就是被加载在这两个GB中的。

系统只有一个KERNEL32.DLL,但是如果程序要用它的时候,并不是用指针来指向它,要知道KERNEL32.DLL只是一个文件,是一个静态的概念,只有它被加载的时候,才是动态的。
xujungood 2004-09-24
  • 打赏
  • 举报
回复
xujungood 2004-09-23
  • 打赏
  • 举报
回复
xujungood 2004-09-22
  • 打赏
  • 举报
回复
但是DLL的好处是能够节省内存空间。如果按照stoneyrh() 的说法,那么既然每个进程的地址空间中都有一份DLL,那DLL的好处就显示不出来了。

而且我看《WINDOWS核心编程》上面写的挂接API的例子是:先在自己进程中找到ExitProcess的地址,然后再用这个地址到远程进程中的输入节中慢慢比对,找到远程进程的输入节中对ExitProcess的引用,将该地址改为自己的地址。 但是,如果Kernel32.dll隐射到每个进程的地址都不同的话,怎么能根据我的进程中ExitProcess的地址来找对方进程的这个函数的地址呢?

但是,如果DLL在系统中是一份的,我就可以通过别的进程中的某个函数的地址来引用该函数,也就不用自己加载了。

这些问题都是我在看WINDOWS核心编程中关于挂接API的叙述中想到的,谁能给我详细讲讲挂接API到底是如何工作的啊
rfa 2004-09-20
  • 打赏
  • 举报
回复
ATField(field) 兄说的Copy-On-Write我的理解是如果是加载的应用程序或者DLL是在固定磁盘(如硬盘)上的话,Windows为了节省应用程序加载的时间就不会实际的把exe和dll全部加载到虚拟空间当中,而是通过某种机制将映射的虚拟地址和硬盘空间地址联系起来,然后所谓Copy-On-Write就是当需要修改它们当中的数据时才真正的写到虚拟地址空间当中去.
这是我对Copy-On-Write机制的理解,不知道对不对,还望众高手不惜赐教,谢谢.
rfa 2004-09-20
  • 打赏
  • 举报
回复
我想应该是每个进程都映射一个DLL,也就是说对于同一个DLL每个进程都要加载一次,但也仅仅限于一次.因为同一进程内的DLL是进程内所有线程共享的.不信我们可以做这么个试验,写两个exe(或者一个也成,运行两次就是了),在它们内部显式加载某个DLL(LoadLibrary),记住路径设置在软盘驱动器上(如A:),然后将要加载的那个DLL复制到软盘里,先运行一个exe等待软盘驱动器的灯灭了,然后再运行第二个exe,这时软盘驱动器的灯照旧亮,而且也会读盘!
搂住可以试试.
kugou123 2004-09-19
  • 打赏
  • 举报
回复
应该是每个进程都有这个DLL数据的一份拷贝。
stoneyrh 2004-09-19
  • 打赏
  • 举报
回复
映射可以理解为:系统在自己的进程地址空间内分配了一片连续的内存(也许是虚存),然后把这个dll拷贝到这一块内存中。假设该块内存的首址是A,而该dll里某一个函数相对于dll的偏址是B,则映射后该函数在该进程空间中的地址就是A+B。win32中,同一个dll在不同的进程中映射的地址是不同的。
stoneyrh 2004-09-19
  • 打赏
  • 举报
回复
那么印射该怎么理解,如果我建了一个进程,既没有显示调用LOADLIBRARY也没有隐含调用,如果我能得到一个DLL中的函数地址,那我是不是也能调用那个函数?
//////////////////////////////////////////////////
当然是不可以啦。如果你没有把这个dll映射到你自己的进程空间,那你得到的是什么地址?你是怎么得到这个地址的?难道你是用别人进程空间的地址?如果你没有相应的权限的话,就会产生内存读写错误,导致进程终止。
duxiaoyes 2004-09-19
  • 打赏
  • 举报
回复
那么印射该怎么理解,如果我建了一个进程,既没有显示调用LOADLIBRARY也没有隐含调用
///////////////////////
你的编译器已经缺省的设置了 引用的头文件 和 lib库
xujungood 2004-09-19
  • 打赏
  • 举报
回复
xujungood 2004-09-18
  • 打赏
  • 举报
回复
那么印射该怎么理解,如果我建了一个进程,既没有显示调用LOADLIBRARY也没有隐含调用,如果我能得到一个DLL中的函数地址,那我是不是也能调用那个函数?
syl5005 2004-09-18
  • 打赏
  • 举报
回复
这个问题问得没水平,不过答问题的有水平(除了我--哈哈哈)
rivershan 2004-09-18
  • 打赏
  • 举报
回复
。。。。
当然就一个dll,否则dll还有什么意义?
ATField 2004-09-18
  • 打赏
  • 举报
回复
DLL中的代码是共享的,全局数据缺省是COPY-on-write,即开始时候是共享的,当某一个进程改写的话便会得到自己的一份拷贝。也可以把全局数据设置为放置在共享段中,这样每个进程便可以共享同一份数据。
加载更多回复(2)

15,471

社区成员

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

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