zoukankan      html  css  js  c++  java
  • Driver②内核模块和系统的关系

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

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

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

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

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

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

    内核安全的由来:

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

    内核模块位于哪里:

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

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

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

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

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

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

  • 相关阅读:
    LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
    字符,字节和编码
    堆和栈的区别
    js正则表达式限制文本框只能输入数字,小数点,英文字母
    WPF 中的 LinkButton
    WPF中DataGrid的应用
    C#获取web.config配置文件内容
    js中格式化时间字符串
    WPF中的用户控件(UserControl)
    VS2010安装其他版本framework的问题解决方案
  • 原文地址:https://www.cnblogs.com/Rehacker/p/11769471.html
Copyright © 2011-2022 走看看