为什么Windows使用DLL而不是直接内核访问

时间:2014-10-25 16:08:48

标签: windows winapi operating-system

当开发人员使用Windows库时,大多数代码都是必需的DLL。

我们使用User32.dll,Kernel32.dll,Gdi32.dll等...

这些都是开发人员使用的。

这些所有dll都使用在SSDT上定义的系统调用。

为什么我们无法直接访问SSDT?为什么微软将dll添加为代理。 什么是DLL作为核心代理的优势。

据我所知,当我们调用LoadLibrary函数时,我们为每个进程分配数据而不是 共享。

如果我们想将其标记为共享,我们将此pragma称为数据

#pragma data_seg (".myseg")

这使我们可以减少DLL上的内存使用量。因为没有进程会再次进行分配。

DLL是否跨进程提供共享和非共享数据? CPU上的CPL 0和CPL 3安全性如何? DLL是否用作核心上的安全层? DLL被用作呼叫门?

1 个答案:

答案 0 :(得分:1)

使用某种形式的异常或中断调用操作系统服务。这是允许处理器更改为内核模式的必要条件。

这通常必须用汇编语言实现。汇编代码将寄存器和堆栈设置为系统服务,然后执行类似

的指令

CHANGE-MODE-TO-KERNEL#100

其中100(我的任意值)是系统服务对应的系统中断向量的索引。数量将根据被调用的系统服务而变化。

在我的简化示例中,处理器命中更改模式指令,触发器和异常,调用中断例程,其地址是中断向量中的第100个条目。该例程是在内核模式下运行的实际系统服务。

在C / C ++ / Pascal程序中,这都是PITA(如果不是不可能的话)。操作系统通常提供包装函数(在Windows中的DLL中),为您完成所有这些操作。

换句话说,应用程序调用一个看似普通的旧C / C ++ / Pascal函数的包装函数,用汇编语言编写设置寄存器并触发异常进入内核模式。相同的函数将解压缩寄存器以将任何数据从系统服务返回到调用程序。