windows驱动开发详解 第二章

  1. 驱动被加载在内核模式下

  2. 特权层Ring0,Ring3都是属于CPU中的概念,指的是,不同的层级可以运行不同的指令

  3. Windows内核模式运行在Ring0层,用户模式运行在Ring3层

  4. 在windows中用户模式和内核模式的切换是通过中断实现的
    在这里插入图片描述

  5. 操作系统和应用程序的关系类似于serverclient的关系

  6. 对计算机任何硬件设备的访问都必须通过操作系统的调用(内核层)
    在这里插入图片描述

  7. 子系统包括win32子系统、OS/2子系统、POSIX子系统、WOW子系统等

  8. win32子系统将API函数转化为Native API函数,Native API没有子系统的概念

  9. 系统服务函数通过IO管理器传递消息给驱动程序

  10. 内核模式下,执行体组件提供大量内核函数供驱动程序调用

  11. 应用程序编译时,会指明该应用程序属于哪个子系统,如“/subsystem:windows”
    在这里插入图片描述

  12. win32 API分为三类,USER函数(USER32.dll)、GDI函数(GDI32.dll)、KERNEL函数(KERNEL32.dll
    USER函数:管理窗口、菜单、对话框和控件
    GDI函数:在物理设备上执行绘图操作
    KERNEL函数:管理非GUI资源,如进程、线程、文件、同步服务等

Native API

  1. Native API一般都是win32 API的名字上增加Nt开头的两个字母
  2. 所有Native API都是在Ntdll.dll中实现的
  3. Native API通过软件中断的方式进入内核模式,并调用内核的系统服务
  4. 软中断的实现方式不同版本Window略有不同,XP下通过sysenter指令完成
  5. 软中断会将Native API中的参数和系统服务号的参数一同传入内核模式,不同的Native API对应不同的系统服务号

系统服务函数

在这里插入图片描述

  1. 系统服务组件中,存在一个系统服务描述符(SSDT),根据Native API所对应的系统服务号,从SSDT中可以查询出对应系统服务函数的函数地址
  2. 系统服务函数和Native API一般名称相同,如Native API中的NtCreateFile会调用系统服务函数NtCreateFile
  3. 系统服务函数会检测参数的合法性,这是最后一道屏障,以后的任何操作,操作系统将不会进行检查
  4. 系统服务函数会将具体的IO操作通过IO管理器传递到驱动程序中

执行体组件

  1. 执行体组件位于Ntoskrnl.exe的上层,而内核位于Ntoskrnl.exe下层

  2. 执行体组件是内核模式下的一组服务函数,位于Ntoskrnl.exe

  3. 执行体组件分为:
    3.1 对象管理程序
    Windows中的所有服务几乎都是以对象形式存在,对象管理程序提供了创建、管理、回收这些对象的接口,如:驱动程序对象(Driver Object),设备对象(Device Object)等

    3.2 进程管理程序
    负责创建和终止进程,进程管理程序依赖其他执行体组件,如对象管理程序、虚拟内存管理程序等

    3.3 虚拟内存管理组件
    虚拟内存不是物理内存,在CPU的内存管理单元(MMU)协助下,通过某种映射将物理内存和虚拟内存关联起来,通过虚拟内存来保证各个程序之间不会互相干扰
    0~0x7FFFFFFF规定为用户模式可用内存地址
    0x80000000~0xFFFFFFFF规定为内核模式可用内存地址
    所有进程内核模式下的虚拟内存映射方式完全一样,即所有程序内核模式部分内存完全一样
    在这里插入图片描述
    虚拟内存管理程序负责虚拟内存的管理,包括:申请、回收等操作

    3.4 I/O管理器
    I/O管理器负责发起I/O请求,并管理这些请求,使来自用户模式的I/O请求独立于设备
    无论对端口的读写,对键盘的访问,对文件磁盘的读写都统一为IRP(I/O Request Package)的请求形式,IRP中包括了读写的具体细节
    IRP被传递到具体设备的驱动中,由驱动程序负责完成这些IRP,并将完成的状态按园路返回到用户模式下的应用程序中
    I/O管理器承担着用户模式代码和设备驱动之间的接口
    3.5 配置管理程序
    配置管理程序记录着计算机软件、硬件的配置信息,使用注册表的数据库来保存这些数据,设备驱动程序根据注册表中的信息进行加载

驱动程序

I/O管理器接受到应用程序的请求后,创建相应的IRP,传送到驱动程序进行处理
有以下几种处理方法:

  1. 根据IRP的请求,直接操作具体硬件,然后完成此IRP,并返回
  2. 将此IRP的请求,转发到更底层的驱动中去,并等待底层驱动的返回
  3. 接收到IRP请求后,不急于完成,而是自己构造新的IRP发到其他驱动程序中,并等待返回

内核

内核和执行体组件是分离的,内核非常小,为执行体组件提供最基本的支持
内核运行在最高特权上,内核提供以下功能:

  • 进程和线程的调度
  • 通过自旋锁(Spin Lock)提供对多CPU的同步支持
  • 中断处理函数的支持
  • 对内核对象的支持
  • 对错误陷阱的支持
  • 对其他硬件特殊功能的支持

内核在调度线程时,不能被其他线程所打断,即不允许线程的切换
内核可以被更高的中断请求级别(IRQL)打断

硬件抽象层(HAL)

硬件抽象层隔绝操作系统和硬件的直接连接
硬件抽象层对各种硬件操作进行了抽象,对上层提供统一的硬件操作接口
驱动程序中应尽量避免使用针对平台的汇编指令,而应该采用平台无关的HAL函数或宏
如端口操作,尽量避免使用INOUT汇编指令,而是采用HAL提供的函数,如READ_PORT_BUFFER_UCHARWRITE_PORT_BUFFER_UCHAR

Windows与微内核

单一内核:所有的系统核心组件都在内核中实现(如IO管理器,进程管理器,内存管理器等)
优点:速度快
缺点:耦合性高
典型:Linux操作系统

微内核:操作系统的主要组件都在(如IO管理器,内存管理器,进程管理器等)运行在独立的进程中,它们有自己私有的地址空间,这些组件之上通过微内核提供的一组服务原语进行通信
优点:耦合性低
缺点:消耗CPU性能
典型:Windows操作系统(不是存粹的微内核)

从应用程序到驱动程序

Windows将所有设备都以普通文件看待
Windows中无论哪种设备都用操作文件的办法去操作设备
在这里插入图片描述
应用程序到驱动程序操作设备的流程:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值