Driver②内核模块和系统的关系

操作系统内核和内核模块:

操作系统内核并非是一个巨大的应用程序,因为计算机硬件种类繁多,不可能做出一个能支持所有硬件的巨大内核。

内核是有接口的,微软提供这个接口,让我们可以通过接口去编写驱动程序,这些驱动程序可以加载到系统内核中,成为内核的一部分。

我们编写的内核模块,可以简单的称之为驱动程序,但是他们并不驱动任何其他的硬件设备。比如显卡驱动驱动显卡~

那么为什么我们又能把他们叫做内核模块呢,这是源于Linux程序员们的叫法,称之为“内核模块(Kernel module)”,也可以称之为驱动程序,驱动程序可以看做内核模块的一种

内核模块已经位于内核空间,作为R0代码执行,所以不受任何限制,可以任意修改内核,因此许多应用程序无法实现的功能,都可以通过编写内核模块来实现。

内核安全的由来:

刚开始的Windows,是没有打算让普通应用程序编写的程序员来提供内核模块的。但是一些牛皮的程序员率先打破了这些限制,编写了杀毒软件,防火墙等不驱动任何硬件的内核模块。最终微软也意识到内核模块的重要性,因此给程序员们提供了接口,方便编程人员使用,如果没有当初的接口的提供和内核编程的改革,也就没有现在的游戏驱动保护和游戏逆向安全的激烈对抗。

内核模块位于哪里:

内核模块位于内核空间,而内核空间又被所有的进程共享,所以,内核模块实际上位于任何一个进程空间中。但是应用程序任何一段代码的执行,一定是位于某个进程空间中的+

不要误认为所有内核代码都运行在系统进程内:

很多人会认为所有内核代码都运行在系统进程内,这是错误的。

Windows所谓的进程是一个名为“system”的进程,是Windows字自身生成的一个特殊的进程,这个进程的进程ID始终为4:

调用PsGetCurrentProcessId,就会发现内核模块分发函数调用时,当前进程一般都不是system进程。但是DriverEntry函数被调用时,一般都位于系统进程内。

这是因为Windows系统一般都用系统进程来加载内核模块,但是并不意味着内核代码始终运行在system进程里~

原文地址:https://www.cnblogs.com/Rehacker/p/11769471.html