1、基础
执行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。
依据处理器上执行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下执行。核心操作系统组件在内核模式下执行。多个驱动程序在内核模式下执行,但某些驱动程序在用户模式下执行。
当启动用户模式的应用程序时。Windows 会为该应用程序创建“进程”。进程为应用程序提供专用的“虚拟地址空间”和专用的“句柄表格”。因为应用程序的虚拟地址空间为专用空间,一个应用程序无法更改属于其它应用程序的数据。每一个应用程序都孤立执行,假设一个应用程序损坏,则损坏会限制到该应用程序。其它应用程序和操作系统不会受该损坏的影响。
用户模式应用程序的虚拟地址空间除了为专用空间以外。还会受到限制。在用户模式下执行的处理器无法訪问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改而且可能损坏关键的操作系统数据。
在内核模式下执行的全部代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其它驱动程序和操作系统自身独立开来。
假设内核模式驱动程序意外写入错误的虚拟地址。则属于操作系统或其它驱动程序的数据可能会受到损坏。假设内核模式驱动程序损坏,则整个操作系统会损坏。
此图说明了用户模式组件与内核模式组件之间的通信。
2、内核层次架构
以下是内核的层次划分:硬件抽象层(HardwareAbstraction Layer) (HAL) (hal.dll)最底层隔离硬件的,底层的第三方驱动程序就执行在这层。
内核(Kernel)实现操作系统的一些底层服务。比方线程调度,多处理器的同步,中断/异常处理等。运行体(Executive)(ntoskrnl.exe)实现主要的操作系统服务,比方主要的线程进程管理,内存管理, IO及进程间通讯等。
窗体图形子系统(Windows Graphics Subsystem)由win32K.sys在内核层实现,用户界面相关都依赖该层,User32.dll的大部分功能都由该层实现。用户层关键进程Windows系统在用户层有几个关键的系统进程:Smss.exe(session manager Subsystem)关于Session的概念能够參考我的这篇。在操作系统启动时会创建一个不与不论什么Session关联的Smss.exe管理者实例。然后当实用户登录时它会为每一个Sessin拷贝一份与之关联的Smss.exe实例,然后由该关联的Smss.exe实例启动winlogon.exe和csrss.exe.WinLogon.exe该进程管理用户的登录和注销,我们按Ctrl+Alt+Del出现的界面和登录后出现的桌面窗体都是由它启动的。
Csrss.exe( Client/Server Runtime Subsystem)我们能够看到我们的桌面窗体(GetDesktopWindow)是由该进程创建的,该进程主要负责Win32子系统的用户模式部分(内核模式部分由win32k.sys实现)。Lsass.exe(Local Security Authority Subsystem)WinLogon.exe通过该进程验证用户登录,登录后产生安全訪问令牌对象。通过该令牌创建Explorer.exe,我们其它用户进程都由Explorer.exe启动。而且继承了该令牌权限。Services.exe该进程简称为SCM(NT Service Control Manager),该进程负责启动用户态一些特殊进程。也就是我们通常所说的服务程序。
3、用户模式调用内核模式的方式
4、内核模式调用用户模式
能够通过IOCTL的上下文传递,也能够通过APC (Asynchronous Procedure Call)直接调用。
5、进程间的通信
第二种很强大的用户模式与内核模式通讯方式,同一时候也支持进程间通讯,该方式就是ALPC(Advanced Local Procedure Call)。该方式被操作系统大量使用。 WinRT中的Broker进程也用到了它。该方式实际上就4个核心函数:nt!NtAlpcSendWaitReceivePort,nt!NtAlpcCreatePort, nt!NtAlpcConnectPort, Nt!AplcAcceptConnectPort, 大概原理例如以下: