异步多线程 处理器的用户模式和内核模式
一、简介
运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。
根据处理器上运行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。多个驱动程序在内核模式下运行,但某些驱动程序在用户模式下运行。
二、虚拟地址空间
1、用户模式的虚拟地址空间
安全,不互相影响。
当启动用户模式的应用程序时,Windows 会为该应用程序创建“进程”。进程为应用程序提供专用的“虚拟地址空间”和专用的“句柄表格”。由于应用程序的虚拟地址空间为专用空间,一个应用程序无法更改属于其他应用程序的数据。每个应用程序都孤立运行,如果一个应用程序损坏,则损坏会限制到该应用程序。其他应用程序和操作系统不会受该损坏的影响。
用户模式应用程序的虚拟地址空间除了为专用空间以外,还会受到限制。在用户模式下运行的处理器无法访问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据。
2、内核模式的虚拟地址空间
所有内核代码共享。
在内核模式下运行的所有代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其他驱动程序和操作系统自身独立开来。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到损坏。如果内核模式驱动程序损坏,则整个操作系统会损坏。
三、内核层次架构
windows程序运行分为内核模式和用户模式,内核模式可以访问所有的内存地址空间, 并且可以访问所有的CPU指令。一般程序运行在用户模式, 通过系统调用切换到内核模式执行系统功能,Windows系统通过这种方式来确保系统的安全和稳定。
下面是内核的层次划分:
硬件抽象层(Hardware Abstraction Layer) (HAL) (hal.dll)
最底层隔离硬件的, 底层的第三方驱动程序就运行在这层。
内核 (Kernel)
实现操作系统的一些底层服务,比如线程调度, 多处理器的同步,中断/异常处理等。
执行体 (Executive)
实现基本的操作系统服务,比如基本的线程进程管理,内存管理, IO及进程间通讯等。
窗口图形子系统(Windows Graphics Subsystem)
由win32K.sys在内核层实现, 用户界面相关都依赖该层, User32.dll的大部分功能都由该层实现。
四、用户模式调用内核模式方式
由用户模式调用内核模式一般有2种方式 系统调用(system call) 和 IOCTL (IO Control Commands)。可以通过IOCTL的上下文传递, 也可以通过APC (Asynchronous Procedure Call)直接调用。