-
驱动被加载在内核模式下
-
特权层Ring0,Ring3都是属于CPU中的概念,指的是,不同的层级可以运行不同的指令
-
Windows内核模式运行在Ring0层,用户模式运行在Ring3层
-
在windows中用户模式和内核模式的切换是通过中断实现的
-
操作系统和应用程序的关系类似于
server
和client
的关系 -
对计算机任何硬件设备的访问都必须通过操作系统的调用(内核层)
-
子系统包括win32子系统、OS/2子系统、POSIX子系统、WOW子系统等
-
win32子系统将API函数转化为Native API函数,Native API没有子系统的概念
-
系统服务函数通过IO管理器传递消息给驱动程序
-
内核模式下,执行体组件提供大量内核函数供驱动程序调用
-
应用程序编译时,会指明该应用程序属于哪个子系统,如“/subsystem:windows”
-
win32 API分为三类,USER函数(
USER32.dll
)、GDI函数(GDI32.dll
)、KERNEL函数(KERNEL32.dll
)
USER函数:管理窗口、菜单、对话框和控件
GDI函数:在物理设备上执行绘图操作
KERNEL函数:管理非GUI资源,如进程、线程、文件、同步服务等
Native API
- Native API一般都是win32 API的名字上增加
Nt
开头的两个字母 - 所有Native API都是在Ntdll.dll中实现的
- Native API通过软件中断的方式进入内核模式,并调用内核的系统服务
- 软中断的实现方式不同版本Window略有不同,XP下通过
sysenter
指令完成 - 软中断会将Native API中的参数和系统服务号的参数一同传入内核模式,不同的Native API对应不同的系统服务号
系统服务函数
- 系统服务组件中,存在一个系统服务描述符(SSDT),根据Native API所对应的系统服务号,从SSDT中可以查询出对应系统服务函数的函数地址
- 系统服务函数和Native API一般名称相同,如Native API中的
NtCreateFile
会调用系统服务函数NtCreateFile
- 系统服务函数会检测参数的合法性,这是最后一道屏障,以后的任何操作,操作系统将不会进行检查
- 系统服务函数会将具体的IO操作通过IO管理器传递到驱动程序中
执行体组件
-
执行体组件位于
Ntoskrnl.exe
的上层,而内核位于Ntoskrnl.exe
下层 -
执行体组件是内核模式下的一组服务函数,位于
Ntoskrnl.exe
中 -
执行体组件分为:
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,传送到驱动程序进行处理
有以下几种处理方法:
- 根据IRP的请求,直接操作具体硬件,然后完成此IRP,并返回
- 将此IRP的请求,转发到更底层的驱动中去,并等待底层驱动的返回
- 接收到IRP请求后,不急于完成,而是自己构造新的IRP发到其他驱动程序中,并等待返回
内核
内核和执行体组件是分离的,内核非常小,为执行体组件提供最基本的支持
内核运行在最高特权上,内核提供以下功能:
- 进程和线程的调度
- 通过自旋锁(Spin Lock)提供对多CPU的同步支持
- 中断处理函数的支持
- 对内核对象的支持
- 对错误陷阱的支持
- 对其他硬件特殊功能的支持
内核在调度线程时,不能被其他线程所打断,即不允许线程的切换
内核可以被更高的中断请求级别(IRQL
)打断
硬件抽象层(HAL)
硬件抽象层隔绝操作系统和硬件的直接连接
硬件抽象层对各种硬件操作进行了抽象,对上层提供统一的硬件操作接口
驱动程序中应尽量避免使用针对平台的汇编指令,而应该采用平台无关的HAL函数或宏
如端口操作,尽量避免使用IN
、OUT
汇编指令,而是采用HAL提供的函数,如READ_PORT_BUFFER_UCHAR
、WRITE_PORT_BUFFER_UCHAR
Windows与微内核
单一内核:所有的系统核心组件都在内核中实现(如IO管理器,进程管理器,内存管理器等)
优点:速度快
缺点:耦合性高
典型:Linux操作系统
微内核:操作系统的主要组件都在(如IO管理器,内存管理器,进程管理器等)运行在独立的进程中,它们有自己私有的地址空间,这些组件之上通过微内核提供的一组服务原语进行通信
优点:耦合性低
缺点:消耗CPU性能
典型:Windows操作系统(不是存粹的微内核)
从应用程序到驱动程序
Windows将所有设备都以普通文件看待
Windows中无论哪种设备都用操作文件的办法去操作设备
应用程序到驱动程序操作设备的流程: