Windows 驱动程序设计(一)

   第二章  Windows操作驱动的基本概念 

   用户模式和内核模式

    Windows总体上分为内核模式(Kernel Model)和用户模式(User Mode)。CPU一般有多个特权层,如Intel的386 CPU有四个特权层,分为Ring 0-3,Ring 0权限最高。内核模式运行在Ring 0层,用户模式运行在Ring 3层。驱动程序是运行在内核层,其相当于windows 内核的 “补丁”,针对不同硬件设备会有不同的 “补丁”。

                             

  Windows API

   分三类:USER函数、GDI函数、KERNEL函数。

   USER函数:这类函数管理窗口、菜单、对话框和控件。

   GDI函数: 这类函数在物理设备上执行绘图操作。

   KERNEL函数:这类函数管理非GUI资源,例如,进程、线程、文件盒同步服务等。

   读者可以在系统中找到USER32.dll、GDI32.dll、KERNEL32.dll。这三个文件提供了以上三类API的接口。当应用程序加载时,操作系统除了将应用加载到内存中同时需要将DLL文件加载到内存中。

    Native API

      大部分Win32子系统的API都是通过Native API实现的。Native API的函数一般都是Win32 的API 前面加上Nt两个字母。例如CreateFile函数对应着NtCreateFile函数。所有Native  API 都在Ntdll,dll中实现。

三个Win32子系统的核心dll文件都是依赖Ntdll.dll。在Win32的底下设置一层Native API的调用是基于版本兼容的考虑。

      系统服务

    Native API 从用户模式穿越进入内核模式,调用系统服务。从用户模式进入内核模式是通过软件中断进入的。不同的windows略有不同,windows 2000是通过 “int 2eh”,在windows xp下通过“sysnter”指令完成。软件中断会将Native API中的参数和系统服务号的参数一同传进内核模式,不同的Native API会对应不同的系统服务号。在系统服务组件中,有一个系统服务描述符表(System Service Descriptor Table)。根据这个系统服务号为索引。从表中可以查出对应系统服务函数地址。

                                     


   执行程序组件

       Windows操作系统提供的所有服务几乎都是以对象形势存在的。虽然windows不是用面向对象的语言开发的,但是他借鉴了很多面向对象语言的概念。对象管理器程序就是创建、管理、回收这些对象的组件。在驱动程序开发中,涉及很多对象,如驱动对象(Driver Object )设备对象(Device Object)等。

   虚拟内存

      在windows中引入虚拟内存的概念,这有别于物理地址的概念。在CPU的内存管理单元(MMU)的协助下,通过某种映射将物理内存和虚拟内存联系起来,每个进程拥有4GB的虚拟内存。windows规定,将4GB的虚拟内存分为两部分,虚拟内存地址0-0x7FFFFFFF规定为用户模式的地址,在用户模式下程序只能访问这段虚拟地址。虚拟内存地址0x80000000-0xFFFFFFFF规定为内核模式的地址,这段虚拟地址只能被内核模式的程序访问。

    I/O管理器

   I/O管理器负责发起I/O请求,并管理这些请求。他有一系列的内核模式下的例程所组成。这些例程为用户模式下的进程提供统一的接口。I/O管理器的目标是使来自用户模式的I/O请求独立于设备。对I/O的操作统一为IRP(I/O Request Package)的请求形式,其中IRP包括对设备操作的重要数据,例如读写操作,读写多少字节,是直接打牌用户进程还是先读到系统缓冲中,在读到用户进程中等。IRP被传递到具体的设备驱动中,驱动负责完成这些IRP并将完成的状态原路返回到用户模式下的应用程序。实际上,I/O管理器承担着用户模式代码和设备驱动程序之间的接口。

    内核

     内核被认为是Windows操作的心脏,内核从执行体组件分割出来,内核负责进程和线程的调度,通过自旋锁(Spin Lock)提供多CPU同步支持,提供中断处理等。

   硬件抽象层

     windows的设计者用硬件抽象层隔绝了操作系统和硬件的直接连接,硬件抽象层是操作系统和具体硬件进行通信,其中硬件抽象层对各种硬件操作进行了抽象,这也是硬件抽象层的由来。

   windows与微内核

     微内核的概念与单一内核的概念是相互对立的,单一内核,一般是将系统的驻澳组件全部在内核实现。例如内存管理器,进程管理器和I/O管理器等。可以想象这样的内核各组件之间的关联很大,也就是说耦合性很大,不利于模块化设计。但是有点就是速度快。

     微内核是将操作系统的主要组件(例如内存管理,进程管理和I/O管理器)运行在独立的进程中,他们有自己的私有地址空间,这些组件之上是微内核提供的一组服务原语。原语值通过进程间通讯进行的,频繁的进程间通讯需要消耗昂贵的CPU时间为代价,这种代价换来的是操作系统核心模块的耦合性降低。

    设备操作

    在windows中江所有设备以普通文件看待,也就是说在windows 中,无论何种设备,都用操作文件的办法来操作设备。对于所有设备的操作统一成文件操作,是飞铲巧妙的,两个都有打开、关闭、读、写、取消等操作。

                              

驱动程序主要负责内核内部的部分,生成IRP,完成任务 ,然后返回!

   

你可能感兴趣的:(驱动)