Driver①内核编程环境以及其特殊性质

先了解几个名词:

内核模式(Kernel mode)

用户模式(User mode)

这两个兄弟也可以被称为 内核态 和 用户态,这两个兄弟态下运行的程序大部分都由C语言编写,但是由于执行的环境,执行的方式都大不相同,所以有比较大的区别哦~

隔离的应用程序:

在我们使用高级语言开发程序的时候,编写的大部分都属于“可执行程序”,在Windows系统下,意味着你要编写一个exe文件出来。一个exe文件执行后,将会创建一个进程(Process).进程有以下几个特点:

①:可以自由使用寄存器,不用关心寄存器被其他进程修改,也就是说各自有自己的一套寄存器,例如我们用CheatEngine逆向植物大战僵尸:

 ②:每个进程的用户空间内存是隔离的,这个好理解:

QQ的用户进程空间内存肯定跟我们自己写的程序空间内存是分开的,不然的话,我随随便便就能窃取别的进程的东西了,那样的话,毫无隐私可言,系统也很混乱

③:通过操作系统约定的方式与其他进程共享其他资源,比如跨进程读取别的进程的内存数据,我们可以用ReadProcessMemory,这些Windows api提供了约定的方式和接口(参数),只要我们严格按照这些编程规范进行编程的话,就不会出现问题

共享的内核空间:

上面我们知道,每个进程的内存空间是相互隔离的,但是大多数的应用程序,必须调用系统提供的一些功能,才能实现相应的功能成为一个完整的应用程序。

所以,在这种情况下,进程被分为两部分:一部分供进程独立使用,称之为用户空间,另一部分容纳操作系统的内核,称为内核空间,或者系统空间

比如:我们依然用植物大战僵尸为例:

此时我们访问的是应用程序的 用户空间:

接下来,我们访问一下内核空间:

我们发现也是可以访问到的,也就是说,用户的进程空间是隔离的,但是内核空间是共享的

那么,问题来了,如果一个操作系统漏洞,可以使硬盘的驱动总是返回失败,那么所有的进程访问硬盘想要读取硬盘数据都将会失败~

这种情况当然是要避免的啦~

内核空间是受到硬件保护的,比如x86下R0(Ring 0)的代码才可以访问内核空间,普通的应用程序编译运行在R3层。

R3调用R0的功能可以吗?可以!只要通过操作系统提供的接口去实现就可以了~这样应用程序既可以去调用内核功能,又不影响修改内核的权利。

-----------------------------------------------------------

我们接下来要进行编写的内核模块,并非以往的应用程序可以双击运行,而是一个模块,执行在内核空间,成为操作系统的一个模块~

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