Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows DLL是以内核模式还是用户模式加载的?_Windows_Dll_Operating System - Fatal编程技术网

Windows DLL是以内核模式还是用户模式加载的?

Windows DLL是以内核模式还是用户模式加载的?,windows,dll,operating-system,Windows,Dll,Operating System,在一次采访中,我被问到这样一个问题: 在windows中,假设启动时有一个依赖于某些DLL的exe exe,然后加载从属DLL,是这些DLL吗 以内核模式还是用户模式加载 我不太清楚这个问题,更不用说答案了——你能帮我解释一下吗 谢谢。我不是Windows内部工作方式的专家,但据我所知,正确答案是用户模式,因为内核空间只允许与操作系统相关的进程 基本上,如果它不是一个操作系统进程,那么它将被分配到用户空间。这个问题非常不精确/不明确。“在Windows中”暗示了一些东西,但不清楚是什么。面试官可

在一次采访中,我被问到这样一个问题:

在windows中,假设启动时有一个依赖于某些DLL的exe exe,然后加载从属DLL,是这些DLL吗 以内核模式还是用户模式加载

我不太清楚这个问题,更不用说答案了——你能帮我解释一下吗


谢谢。

我不是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,就无法知道它的物理内存地址