windows驱动开发基础.from MSDN

191 阅读4分钟

windows驱动开发基础.from MSDN

windows驱动开发基础.
from MSDN :docs.microsoft.com/en-us/windo…

面向所有驱动程序开发人员的概念:
用户模式和内核模式–User mode and kernel mode
虚拟地址空间–Virtual address spaces
设备节点和设备堆栈–Device nodes and device stacks
I/O请求数据包–I/O request packets
驱动程序堆栈–Driver stacks
微型驱动设备和驱动程序对象–Minidrivers and driver pairs
windows驱动程序工具包中的头文件–Header files in the Windows Driver Kit
为不同版本的windows编写驱动程序–Writing drivers for different versions of Windows

用户模式和内核模式
用户模式:
运行在windows的计算机中的处理器具有两种不同的模式:用户模式和内核模式.
处理器根据处理器上运行的代码类型在两种模式之间切换.应用程序在用户模式下运行,核心操作系统组件在内核模式下运行,虽然许多驱动程序在内核模式下运行,但某些驱动程序可能在用户模式下运行.
用户模式:启动用户模式应用程序时,windows将为该应用程序创建一个进程,该过程为应用程序提供专用虚拟地址空间和专用句柄表.由于应用程序的虚拟地址空间是专用的,因此一个应用程序无法更改属于另一个应用程序的数据,每个应用程序都单独运行,如果某个应用程序崩溃,则崩溃仅限于该应用程序,其他应用程序和操作系统不受崩溃影响.
除私有之外,用户模式应用程序的虚拟地址空间是有限的,在用户模式下运行的处理器无法访问为操作系统保留的虚拟地址.限制用户模式应用程序的虚拟地址空间可防止应用程序更改并可能损坏关键操作系统数据.
内核模式:
在内核模式下运行的所有代码共享单个虚拟地址空间.这意味着内核模式驱动程序不会与其他驱动程序和操作系统本身隔离.如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能受到威胁.如果内核模式驱动程序崩溃,整个操作系统也会崩溃.
此图说明了用户模式组件和内核模式组件之间的通信.

虚拟地址空间:
当处理器读取或写入内存位置时,它使用虚拟地址.作为读取或写入操作的一部分,处理器将虚拟地址转换为物理地址.
通过虚拟地址访问内存具有以下优点:
程序可以使用连续范围的虚拟内存地址来访问物理内存中不连续的大型内存缓冲区.
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区.当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为4KB)保存到磁盘文件中,数据或代码也根据需要在物理内存和磁盘之间移动.
应用程序间地址隔离.一个进程中的代码不能改变另一个进程或操作系统正在使用的物理内存.
进程可用的虚拟地址范围称为进程的虚拟地址空间.每个用户模式进程都有自己的专用虚拟地址空间.
对于32位进程,虚拟地址空间通常是2GB的范围,从0x00000000到0x7fffffff.
对于64位windows上的64位进程,虚拟地址空间通常是128TB的范围.从0x000’000000000到0x7fff’ffffffff.
页面缓冲池和非页面缓冲池:
在用户空间中,可以根据需要将所有物理内存页分页到磁盘文件中。在系统空间中,某些物理页可以分页,而其他物理页则不能。系统空间有两个用于动态分配内存的区域:页面缓冲池和非页面缓冲池。
可以根据需要将页面缓冲池中分配的内存分页到磁盘文件。在非页面缓冲池中分配的内存永远不能分页到磁盘文件。

标准驱动程序例程,必须在启动中实现以响应来自windows或其他启动程序的调用的必须和可选例程.
所有的驱动程序都需要以下例程:
驱动程序入口(DriverEntry):
设备添加例程(AddDevice):
IRP分发例程(以”Dispatch”开头的例程,如DispatchCreate):
驱动程序卸载(DriverUnload):