Windows DLL是以内核模式还是用户模式加载的?
在一次采访中,我被问到这样一个问题: 在windows中,假设启动时有一个依赖于某些DLL的exe exe,然后加载从属DLL,是这些DLL吗 以内核模式还是用户模式加载 我不太清楚这个问题,更不用说答案了——你能帮我解释一下吗Windows DLL是以内核模式还是用户模式加载的?,windows,dll,operating-system,Windows,Dll,Operating System,在一次采访中,我被问到这样一个问题: 在windows中,假设启动时有一个依赖于某些DLL的exe exe,然后加载从属DLL,是这些DLL吗 以内核模式还是用户模式加载 我不太清楚这个问题,更不用说答案了——你能帮我解释一下吗 谢谢。我不是Windows内部工作方式的专家,但据我所知,正确答案是用户模式,因为内核空间只允许与操作系统相关的进程 基本上,如果它不是一个操作系统进程,那么它将被分配到用户空间。这个问题非常不精确/不明确。“在Windows中”暗示了一些东西,但不清楚是什么。面试官可
谢谢。我不是Windows内部工作方式的专家,但据我所知,正确答案是用户模式,因为内核空间只允许与操作系统相关的进程
基本上,如果它不是一个操作系统进程,那么它将被分配到用户空间。这个问题非常不精确/不明确。“在Windows中”暗示了一些东西,但不清楚是什么。面试官可能指的是Win32子系统,也就是你通常作为最终用户看到的Windows部分。问题的最后一部分更加含糊不清 现在,虽然process和section对象(在MSDN中称为MMF,加载的PE映像,如
.exe
和.dll
和.sys
)确实是内核对象,需要底层执行器(和内存管理器等)的一些帮助,但dll中的相应代码(包括DllMain
中的线程)在从用户模式进程调用时,其行为与任何其他用户模式进程完全相同。也就是说,从DLL运行代码的每个线程都将转换到内核模式,以最终利用操作系统服务(打开文件、加载PE文件、创建事件等)或者在用户模式下做一些足够的事情
也许面试官甚至对有时被称为“内核空间”和“用户空间”的内存范围感兴趣,传统上32位的内存范围为2GB边界。是的,DLL通常在2GB边界以下,即“用户空间”,而其他共享内存(内存映射文件,MMF)通常在该边界以上
甚至有可能面试官成为对DLL的一种常见误解的受害者。DLL本身只是一个休眠的内存,它从来没有自己运行过任何东西(是的,对于DllMain
)。当然,加载程序会处理诸如重新定位之类的所有事情,但最终,如果没有显式或隐式调用(在加载DLL的进程的某个线程的上下文中),任何东西都不会运行。因此,出于所有实际目的,这个问题都需要您回访
- 定义“在Windows中”
- 另外,“DLL在内核模式或用户模式下加载”,这是指进行加载的代码还是指最终结果(即代码运行的位置或加载的内存范围)?部分代码在用户模式下运行,其他部分在内核模式下运行
让我再补充一些信息。从另一个答案的评论来看,人们似乎对DLL和驱动程序有着同样的误解。驱动程序更接近DLL的概念,而不是EXE(或最终的“进程”)。问题是,驱动程序在大多数情况下不会自己做任何事情(虽然它可以创建系统线程来改变这一点)。驱动程序不是进程,也不会创建进程。对于任何为windows进行任何重要应用程序开发的人来说,答案显然是用户模式。让我解释两件事 DLL 动态链接库与常规的旧链接库或.lib非常相似。当应用程序使用.lib时,它会在编译后立即粘贴到函数定义中。通常使用.lib来存储API并修改函数,而不必重建整个项目,只需在旧的和旧的链接库上粘贴同名的新.lib即可由于接口(函数名和参数)没有改变,它仍然可以工作。非常好的模块化 .dll的作用完全相同,但它不需要重新链接或任何编译。你可以将.dll本质上看作一个.lib,它被编译成一个.exe,就像使用它的应用程序一样。只需将共享名称和函数签名的新.dll放在一起,它就可以正常工作。你可以简单地更新你的应用程序这就是为什么大多数windows软件都由.dll和一些exe组成 .dll的使用有两种方式 隐式链接 要以这种方式链接,如果您有一个.dll
userapplication.dll
,您将有一个定义dll中所有入口点的userapplication.lib
。您只需链接到静态链接库,然后将.dll包含在工作目录中
显式链接
通过先调用LoadLibrary(userapplication.dll)
返回.dll的句柄,然后调用GetProcAddress(句柄,“FunctionInUserApplicationDll”)以编程方式加载.dll
返回您可以使用的函数指针。这样,您的应用程序可以在尝试使用它之前检查内容。c
有点不同,但更简单
用户/内核模式
Windows有两种主要的执行模式。用户模式和内核模式(内核进一步分为系统和会话)。对于用户模式,物理内存地址是不透明的。用户模式使用映射到实际内存空间的虚拟内存。用户模式驱动程序同时也是.dll。用户模式应用程序通常可以使用大约4Gb的虚拟寻址空间。两个不同的应用程序不能有意义地使用这些地址,因为它们在应用程序或进程的上下文中使用。对于用户模式的应用程序来说,如果没有b,就无法知道它的物理内存地址