题外话:
“我什么时候能长胖一点?”午觉刚醒,我看着自己竹竿似的手臂轻笑道。今天下午还是悠闲点,了解一下一些windows系统内核驱动的概念吧,操作固然重要,概念真的是不能少的。
NT驱动开发学习笔记四2011.05.06
基本概念:
Windows两个模式:内核模式(Kernel Mode)和用户模式(User Mode)。对比起Linux系统的单一内核,这样Linux的速度就会很快,可是单一内核的耦合性太高了。
CPU的4个特权层(i386):分别是Ring0 到 Ring3,其中Ring0最高,Ring3最低。
Windows总体架构:
用户模式:应用程序 -> WIN32 子系统 -> Native API
内核模式:系统服务函数 -> 执行体组件/驱动程序 -> 内核 -> 硬件抽象层 -> 具体硬件
用户模式到内核模式:Native API -> 系统服务函数
执行体组件:I/O管理器、对象管理器、进程管理器、虚拟内存处理器、配置管理器等其。
应用程序与WIN32子系统:
WIN32子系统:在Windows设计者为了把其他操作系统方便移植到windows上,设计了子系统(所以说什么windows移植性差的,别人开发Windows这么聪明没想到么?)。
应用程序在编译的时候,会用/subsystem:windows指明是WIN32子系统的应用程序。
Windows API分为三类:
USER函数:管理窗口、菜单、对话框和控件
GDI函数:这类函数在物理设备执行绘图操作(Graphics Device Interface)
KERNEL函数:管理非GUI(Graphics User Interface)资源,系统服务功能
WIN32子系统从用户模式到内核模式的实现:
USER32.DLL/GDI32.DLL -> WIN32K.SYS(WIN32子系统的内核实现,Kernel Mode)
KERNEL32.DLL -> NTOSKRNL.EXE(WIN32子系统的内核实现,Kernel Mode)
Native API:
如架构所视,大部分WIN32子系统的API,都是通过Native API 实现的,一般看来,Native API都是win32 API 前面加上一个 Nt。Native API 的 dll都是在 Ntdll.dll 中实现的。不同的NT(2000:NT5.0,XP:NT5.1,2003:NT5.3)系统的Native API都有区别的,所以应用程序多使用WIN32 API。
Windows系统服务:
Native API 从用户模式穿越到内核模式(之前好流行穿越啊,各种穿越,跑题了),从而调用系统服务。这个过程是通过软中断完成的,Windows2000下通过“int 2eh”,XP下通过“sysenter”,软中断会将Native API 中的参数和系统服务的参数一同传进内核模式,不同的Native API 会对应不同的服务号,就是在SSDT表中的位置。其中从SSDT表中查到的Nt函数地址是在 ntoskrnl.exe里的(nt!加上函数名)。
执行体组件:
执行体组件的分成各个组件:
①对象管理程序:windows 用数据结构来构造“对象”,但是这种“对象”中,不像c/c++ 中说的结构体全部都是公有的,这种“对象”其中也有一些“私有”的成员,必须通过Windows体统的一些例程,才能访问,这些例程就像“不在类内的公有成员函数”(比喻比喻)。
②进程管理程序:用于管理进程的创建和终止,但是进程中的线程却是由内核负责的,进程相对来说只是线程的一个容器。
③虚拟内存管理程序:在CPU的MMU(Memory Management Unit)的协助下完成的内存映射技术。进程有4GB的虚拟内存,其中2GB是用户模式的,其他2GB是内核模式的。Windows中所有进程的内核模式下的虚拟内存的映射方式是完全一样的。
④I/O管理器:I/O管理器负责发起I/O请求,并且管理这些请求,通过IRP,应用程序就能和驱动程序通信了。
⑤配置管理程序:用于配置软件和硬件的信息,就用注册表(Registry)这个数据库来保存这个数据。
硬件抽象层:
硬件抽象层是使得对硬件的操作进行了抽象,方便于对硬件进行抽象。