Windows内核模式组件有:Windows执行体(executive)、Windows内核(kernel)、设备驱动程序(device drivers)、硬件抽象层(HAL)、窗口和图形系统(User32.dll及Gdi32.dll的内核实现)。
其中执行体在最上层,提供基本的操作系统服务,由中层的内核与驱动程序所支持,最下层为硬件抽象层隔离平台硬件差异。窗口和图形系统移进内核是当时为了提高UI性能,Vista之后又把这部分移回用户层了。
Windows核心系统文件:
Ntoskrnl.exe 执行体和内核
Ntkrnlpa.exe 执行体和内核,支持物理地址扩展(PAE)
Hal.dll 硬件抽象层
Win32k.sys Windows子系统的内核模式部分
Ntdll.dll 系统服务存根和内部支持函数
Kernel32.dll User32.dll Gdi32.dll Windows子系统DLL
考虑到性能,内核和HAL文件和单处理器和多处理器版本之分:
Ntoskrnl.exe Ntkrnlmp.exe
Ntkrnlpa.exe Ntkrpamp.exe
Hal.dll、Halacpi.dll Halmps.dll、Halmacpi.dll
书里为窗口管理和GDI实现移至内核长篇大论辟了一通谣,可惜就在几年后的Vista一直到现在的Win10又把这部分实现移回至用户层,哈哈,打脸了。
执行体的主要组件有:配置管理器、进程和线程管理器、I/O管理器、即插即用管理器、高速缓存管理器、内存管理器。
内核提供一些最基本的机制,如线程调度、同步服务,代码主要用C编写。
WDM驱动分类总线型驱动、功能型驱动、过滤型驱动。设备驱动程序和Windows服务都是在HKLM\SYSTEM\CurrentControlSet\Services中定义的,通过类型值来区分。
系统线程通过PsCreateSystemThread函数创建。
会话管理器(Smss.exe)是系统中第一个创建的用户模式进程,做完一些初始化任务后,启动登陆进程和子系统进程。
登陆进程(Winlogon.exe)捕获密码后交由本地安全认证服务器进程(Lsass.exe)进行认证。完成认证后,LSASS生成一个访问令牌对象,登陆进程利用此访问令牌创建用户会话的初始进程Userinit.exe(HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon的Userinit字符串值配置)。
Userinit.exe最后会创建Explorer.exe(HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon的Shell字符串值配置)。