一、基本框架
二、基本概念
1、操作系统的主要任务是调度线程,还有一些必要的工作,如:内存管理,进程管理,安全管理和I/O管理,这些部分叫做执行部件。
2、Ring是CPU的概念,而用户/内核模式是操作系统的概念。编写驱动主要为了操作硬件,如访问物理内存,设备端口等。驱动程序相当于内核的补丁,不同硬件设备会有不同的补丁。Windwos中,用户态与内核态切换通过软中断来进行。
3、操作系统分层
Windows可运行在单CPU上和对称多CPU上。“对称多CPU”指每个CPU平分负载;"主从多CPU"指主CPU负责调度从CPU。
Windows的设计思路是将内枋尽量可能小,采用“客户端-服务器”结构,操作系统各个组件或者模块是通过消息进行通信的。
图 windows构架图P38
子系统如Win 32,OS/2等。
在内核模式下,执行体组件提供了大量的内核函数供驱动程序调用。内核主要负责进程、线程的调度。驱动程序通过硬件抽象层与硬件进行操作。
4、WIN32子系统
这个子系统提供的应用程序接口有以下几个方面:
·图形用户接口: 提供给用户可视的窗口,对话框,控件,字体等接口。
·控制台I/O: 包括键盘,鼠标,显示器,以及其它子系统。
·执行WIN32应用程序接口: 提供应用程序或者其它子系统与执行部件的接口。
因为WIN32子系统在操作系统中的特殊地位和它所提供的高性能,所以它的实现方式与其它的子系统完全不同。它被分成了好几个部分,其中一些工作在用户模式,一些工作在内核模式。通常,WIN32应用程序接口被分成3部分:
USER函数: 管理窗口,菜单,控件,对话框等。
GUI函数: 在物理设备(如:显示器,打印机)上绘图。
KENEL函数:管理非GUI资源,例如: 进程,线程,文件,同步服务,KENEL函数接近于执行部件的服务。
WIN NT4.0以后,USER函数和GUI函数被移到内核模式,因此,用户模式的请求用系统服务接口直接送到内核模式。USER函数和GUI函数被安置在 WIN32K.SYS中,相反的,KENEL函数依赖于一个标准的服务程序CSRSS.exe去反应用户程序请求。
图 Win32子系统在内核中的实现实现 P40
5、Native API 是在Ntdll.dll中实现的。
软中断将Native API中的参数和系统服务号的参数一同传进内核模式,不同Native API对应不同的系统服务号。在系统服务组件中,有一个系统服务描述表,根据这个系统服务号为索引,从表中查找出对应系统服务函数的函数地址。
进程管理器负责创建和终止进程,线程的调度是由内核完成的。
I/O管理器起到用户模式代码和内核模式代码间接口。
6、内核为执行组件提供最基本的支持,它负责提供进程和线程的调度,通过自旋锁(spin lock),提供对多CPU同步支持,提供中断处理等。内核在调度线程时不能被其它线程打断,即不允许线程切换,但是内核可以被更高的中断请求级别(IRQL)打断。
在驱动程序中,尽量避免针对平台的汇编指令,而应用与平台无关的HAL函数或宏。
7、单一内核:主要核心组件全部在内核实现。微内核:主要组件运行在独立的进程中,它们有自己私有的地址空间,在这之上是内核提供的一组服务原语。
8、Windows常用设备:文件,目录,逻辑磁盘,物理磁盘,串口设备,并口设备。
图 应用程序到驱动程序 P47