操作系统与驱动程序 1.硬件抽象层保证windows可移植性 2.Win32 API保证应用程序的兼容性,应用程序可在不同版本的windows中正常运行 3.对于涉及硬件的操作都由内核层执行,没应用层啥事。 4.操作系统内核负责调度线程,线程运行在自己的线程上下文中,也就是CPU寄存器状态、线程ID、优先权等等。 5.Windows的I/O操作基于异步设计,也就是线程发起I/O操作,CPU不用候着,可以去做别的事,等I/O操作完成后通知一下CPU就行。 6.在编写驱动,尽量支持异步操作。编写驱动程序主要是为了操作硬件设备。 7.编写驱动程序尽量避免Bug,例如:缓冲区溢出。会造成难以估计的后果。 8.Windows中内核和用户模式都是通过软件中断来实现, 9.操作系统(内核模式)与应用程序隔离。操作系统的各个组件和模块通过消息进行通信。 10.内核模式,执行体组件(例如,I/O管理器)提供了大量供驱动程序调用的内核函数,内核主要负责进城和线程调度,驱动程序通过硬件抽象层直接去具体硬件进行操作。 11.应用程序在编译和链接的时候,都会指明应用程序属于哪个子系统(例如win32 API),使用接口就能开发应用程序了。windows系统文件USER32.dll、GDI32.dll、KERNEL.dll,分别表示提供了三类API,当应用程序加载到内存中的时候,操作系统会将以上三个dll文件加载到内存中。 12.工具:Dependency用于查看应用程序用到的dll文件。动态链接吗? 13.Win32 API是通过Native API实现的,在应用层API函数前加Nt-就表示原生API,且NativeAPI是通过Ntdll.dll实现的。是用户模式进入内核模式的大门,通过软件中断(调试驱动能发现,当调用应用层某个函数时,会中断进入内核层)方式进入,并调用内核的系统服务。 14.系统服务是啥?让进入内核模式时,软中断传参(参数,系统服务号),在系统组件中有系统服务描述符,以系统服务号为索引去找到系统服务函数的函数地址。如:CreateFile(Win32API)->Nt CreateFile(Native API)->系统函数(与前面相同且去通过系统服务号找到的系统函数),系统服务描述符表保存在ntoskrnl.exe中。 15.而执行程序组件则位于ntoskrnl.exe的上层。包括对象管理器、进程管理器、虚拟内存管理器、I/O管理器和配置管理器。 16.对象管理器,驱动开发中的驱动程序对象、设备对象都是一种对象,而对象管理器程序就是负责创建、管理、回收、这些对象的。windows提供的所有服务几乎都是以对象的形式存在。 一些对象(数据结构形式)可直接被程序员读写,相当于实例对象的public中的成员变量,可以直接改变数值;不能的就是private。所以加载就是将类实例化后操作。 17. 进程管理器,进程是线程的容器。负责创建和终止进程。线程由内核调度。 18. 虚拟内存管理器,负责对虚拟内存的申请、回收等操作。 19.I/O管理器,负责发起I/O请求并管理这些请求。有内核模式一系列例程(IoFastDisparch等)组成,为用户模式提供同一接口,例如,对于端口的读写同一为IRP,包含对设备操作数据,传递到具体设备的驱动程序中,驱动程序负责完成这些IRP然后将完成的状态返回用户程序,也就说担当着用户模式代码和设备驱动程序之间的接口。 20. 配置管理器,通过一个注册表(register)保存所有计算机软硬件的配置信息,设备驱动程序根据注册表中的信息进行加载,也就是DriverEntry注册的一些东西。 21. 内核,内核模式中分为执行体组件、驱动程序和执行体组件。其中内核是操作系统的心脏,负责进程和线程的调度,例如通过自旋锁同步多个cpu,中断处理等等。内核调度线程不能被其他线程打断。 22. 硬件抽象层,隔绝操作系统与硬件的直接联系,在他俩中间。为他俩提供通信通道,
|