深入解析Windows操作系统(笔记9)

  I/O管理器创建一个IRP(I/O request packet)来代表一个I/O操作,并且将该IRP传递给正确的驱动程序。同时,I/O管理器中也提供了许多其他驱动程序都会使用到的通用的例程。
  如果一个驱动程序需要应用程序能够打开该设备对象,必须在\Global??(Win2K中为\??)目录中创建一个符号链接,并且使它指向\Device目录中的该设备对象的名称。

  快速I/O是一种特殊的机制,它使得I/O系统可以避免生成一个IRP,而是直接到达文件系统驱动程序或者缓存管理器。

  IRP由两部分组成:一个固定的头以及一个或者多个栈单元。固定的头包含如请求类型和大小、同步或异步、缓冲区指针、主次功能代码等信息。

  IRP缓冲区管理:
  缓冲的I/O:I/O管理器从非换页内存池中申请一个缓冲区,大小等同于调用者的缓冲区大小。
  直接I/O:I/O管理器创建此IRP时,将用户缓冲区锁在内存中(不可换页的),并以MDL(memory descriptor list,内存描述符列表)的形式保存了此块内存的一个描述。
  其他I/O:I/O管理器不作任何管理,完全由驱动程序自行处理。

  当一个设备中断发生时,处理器将控制权交给内核的陷阱处理器(trap handler),陷阱处理器根据中断号,在其中断分发表中找到该设备的ISR,调用ISR前关闭此设备中断,插入DPC队列,开中断。DPC中调用IoCompleteRequest通知I/O管理器已经完成该IRP,最后I/O管理器需要将完成的信息缓冲区内容等拷贝给调用者虚拟地址空间中,如果此IRP是同步的,则调用者地址空间当前可直接访问,如果是异步的,则I/O管理器把一个内核模式的异步过程调用(APC,asynchronous procedure call)排队到调用者线程中,下一次调用者线程在低IRQL上执行时,此APC得以交付执行。

  应用程序使用IoCompletion执行体对象,把它作为与多个文件句柄相关联起来,任何在此文件上完成的异步I/O操作都会导致一个完成包(completion package)被排队到完成端口中,等待此完成端口的线程就能等待到I/O操作的完成事件。

  PnP管理器从一个称为Root的虚拟总线型驱动程序开始设备列举过程,Root代表了整个计算机系统,也担当了所有非即插即用驱动程序和HAL的总线型驱动程序。HAL也被认为是一个总线型驱动程序,HAL是通过注册表中的硬件描述来监测系统主总线上的设备。

  驱动的加载和初始化顺序如下:
  1.I/O管理器调用每个引导-启动的驱动程序的入口例程。如果该驱动程序有子设备,I/O管理器列举子设备给PnP管理器,子设备驱动也是引导-启动则被配置启动,不是则PnP管理器只创建一个devnode但不加载启动驱动设备。
  2.所有引导-启动初始完以后,PnP管理器加载启动devnode节点中没有被启动的驱动,并列举该设备的子设备,为所有子设备同样完成此过程(如果存在子设备,而且PnP管理器在枚举启动过程中忽略驱动程序的Start值,除了定义为禁止启动)。
  3.PnP管理器加载启动Start值为系统-启动的驱动程序。(这些驱动设备均为不可被列举的,因为可枚举的已经在步骤2中加载完了)
  4.服务管理器加载启动Start值为自动-启动的驱动程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值