Winodws系统结构
Windows引导过程:
- BIOS
- MBR
- 引导扇区(引导分区的第一个扇区)
- 引导扇区后续扇区
- ntldr(实模式部分):切换至保护模式
- ntldr(保护模式部分:os loader)
ntldr的工作:
构造内存描述符数组;映射页面,设置页目录寄存器,打开内存页面映射机制;处理boot.ini;执行ntdetect.com;加载内核模块ntoskrnl.exe、hal.dll和SYSTEM储巢;加载引导驱动程序和必要的文件系统驱动程序;构造LOADER_PARAMETER_BLOCK参数块;将控制交给内核模块ntoskrnl.exe的入口函数
内核初始化:
- 0阶段初始化:在进程中进行。初始化CPU和一部分kernel的数据机构。
- 1阶段初始化:在线程中进行,可并发。初始化绝大多数的模块。
操作系统内核与驱动开发
内核与驱动的关系
功能角度,驱动在内核的下层。硬件=>驱动=>内核=>应用。代码角度,驱动和内核开发实际融为一体。
驱动开发需要考虑问题:同步异步/共享独占/缓冲区管理/设备状态管理。
驱动属于IO系统的一部分,向下是HAL或硬件。
驱动开发
什么是驱动程序?
驱动程序是一个软件组件,可让操作系统和设备彼此通信。 例如,假设应用程序需要从设备中读取某些数据。 应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。
并非所有驱动程序都直接与设备通信。堆栈中直接与设备通信的一个驱动程序称为“函数驱动程序” ;执行辅助处理的驱动程序称为“筛选器驱动程序” 。
软件驱动程序:未与设备关联的驱动程序 。可以访问核心操作系统数据结构。
扩展定义:驱动程序是观察或参与操作系统和设备之间通信的任何软件组件。
Windows驱动开发模型:
DDK(Driver Developer Kit)=>WDK(Windows Driver Kit)
操作系统与驱动程序之间遵循容器与插件模型。Driver是一种被动的软件模块。驱动程序是一个回调函数的集合体,类似于DLL程序。
驱动程序可以调用Windows内核API、WDK运行时间库和其他驱动程序。不能调用用户模式API和ISO规定的C/C++标准函数库。
驱动对象与设备对象:
一个驱动对象下可能有多个设备对象,一个设备对象只能对应一个驱动对象。
IRP(I/O Request Package):
上层应用程序与下层设备进行IO时,利用IRP进行通信。