1、基础

执行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。

依据处理器上执行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下执行。核心操作系统组件在内核模式下执行。多个驱动程序在内核模式下执行,但某些驱动程序在用户模式下执行。

当启动用户模式的应用程序时。Windows 会为该应用程序创建“进程”。进程为应用程序提供专用的“虚拟地址空间”和专用的“句柄表格”。因为应用程序的虚拟地址空间为专用空间,一个应用程序无法更改属于其它应用程序的数据。每一个应用程序都孤立执行,假设一个应用程序损坏,则损坏会限制到该应用程序。其它应用程序和操作系统不会受该损坏的影响。

用户模式应用程序的虚拟地址空间除了为专用空间以外。还会受到限制。在用户模式下执行的处理器无法訪问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改而且可能损坏关键的操作系统数据。

在内核模式下执行的全部代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其它驱动程序和操作系统自身独立开来。

假设内核模式驱动程序意外写入错误的虚拟地址。则属于操作系统或其它驱动程序的数据可能会受到损坏。假设内核模式驱动程序损坏,则整个操作系统会损坏。

此图说明了用户模式组件与内核模式组件之间的通信。

2、内核层次架构

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3p5MTk4ODUy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

以下是内核的层次划分:



硬件抽象层(HardwareAbstraction Layer) (HAL) (hal.dll)

最底层隔离硬件的,底层的第三方驱动程序就执行在这层。

内核(Kernel)

实现操作系统的一些底层服务。比方线程调度,多处理器的同步,中断/异常处理等。



运行体(Executive)(ntoskrnl.exe)

实现主要的操作系统服务,比方主要的线程进程管理,内存管理, IO及进程间通讯等。

窗体图形子系统(Windows Graphics Subsystem)

由win32K.sys在内核层实现,用户界面相关都依赖该层,User32.dll的大部分功能都由该层实现。



用户层关键进程



Windows系统在用户层有几个关键的系统进程:



Smss.exe(session manager Subsystem)

关于Session的概念能够參考我的这篇Sessions,
Window Stationsand Desktops
。在操作系统启动时会创建一个不与不论什么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, 大概原理例如以下:

理解Windows内核模式与用户模式的更多相关文章

  1. Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式

    引言 本来在写一篇Windows内存管理的文章,写着写着就发现好多基础的概念都要先讲.更可怕的是,这些基础的概念我却不能完全讲清楚.只好再把这本<深入解析Windows操作系统>翻到第一章 ...

  2. CentOS6.3修复模式/单用户模式修改fstab文件

    今天修改LVM逻辑卷的名称时候,忘记更改fstab配置文件了,导致机器重启后找不到盘,进不了系统!立即用光盘进入修复模式进行修复!  1.修复模式操作方法: 用光盘进入Linux修复模式,插入cent ...

  3. 向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知

    完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEV ...

  4. centos7救援模式--单机模式(单用户模式)

    前序 经典问题: 单机模式, 当系统忘记某用户登录密码的时候可以解决密码重置问题 操作 1 开机的时候出现选择进入系统的界面时, 按E键 2 选择定位到ro这里, 替换成rw init=/sysroo ...

  5. 【windows 操作系统】【CPU】用户模式和内核模式(用户层和内核层)

    所有的现代操作系统中,CPU是在两种不同的模式下运行的: 注意以下内容来自微软: windows用户模式和内核模式 运行 Windows 的计算机中的处理器有两个不同模式:用户模式 和内核模式 . 用 ...

  6. CPU内核、用户模式

    本文由是阅读该文章做下的笔记. CPU分内核与用户模式. 三言蔽之 内核模式下,应用可以直接存取内存,能够执行任何CPU指令.一般来说驱动运行在该模式下.内核模式的应用一旦崩溃,整个操作系统都会崩溃. ...

  7. 使用WinDbg调试入门(用户模式)

    windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中.在这里,提供个实践练习,帮助我们开始使用windbg作为用户模式调试器. 用WinDbg调试记事本 1.导航到安装目录,然后 ...

  8. OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?

    OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...

  9. CentOS 7 单用户模式+救援模式

    CentOS 7 单用户模式+救援模式 CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导 ...

随机推荐

  1. HTML5给我们带来了什么

    websocket 根据维基定义 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端直接向客户端推送数据而不需要客户端进行请求,在 WebSocket API 中,浏览器和服 ...

  2. 用PowerMockito来mock私有方法(转)

    话说我们做的所谓的接口测试真的是不伦不类啊,测的是controller层,那叫接口木??!!可是老大们说写的是接口测试,那就接口吧! 自接手写这个接口测试不久,很多人,包括一个关系比较好的架构师就跟我 ...

  3. 基于visual Studio2013解决算法导论之004随机排列数组

     题目 随机排列数组 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> # ...

  4. LoadRunner脚本增强

    1.检查点 web_find() 和web_reg_find() 2.Block技术 如果对不同的事物进行不同次数的循环该怎么处理?默认情况下LoadRunner对所有的事物都是统一执行的,即虽然有多 ...

  5. 程序集的内部结构(托管模块、元素局、IL代码的分布情况)

    程序集的内部结构 在看程序集的结构之前,我们先来看托管模块的结构. 托管模块由四部分组成:PE32头.CLR头.元数据(Metadata).IL代码.其中PE32头是用来决定托管模块运行的系统环境(3 ...

  6. Apache服务器学习笔记

    Apache服务器知识 首先我们要知道一共有那几个程序在监听网络端口,即与网络保持活跃连接,打开CMD命令窗口 输入: netstat  –an 指令就能显示出所有与网络保持连接的程序,输入net s ...

  7. Androidclient与服务端(jsp)之间json的传输与解析【附效果图附源代码】

    近期有个项目须要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,能够实现基本功能:androidclient发送json到服务端,服务端使用jsp接收,解析后以jso ...

  8. Endnote从头开始五:修改output style(转载)

    Endnote从头开始五:修改output style Endnote中虽然有大量的期刊格式,但是并不能囊括所有我们需要的style,所以学会自己制作或编辑已有的期刊格式是很重要的,本节内容是Endn ...

  9. memset,memcpy,memmove,strcpy,strcat,strcmp的实现(其实很简单,每个程序都只有几行代码)

    面试中的几个小问题 1.对stl中list封装(参考1): 2.对重要C函数实现(参考2): //memset void *memset(void *buffer, int c, int count) ...

  10. Matlab图像处理系列2———空间域平滑滤波器

    注:本系列来自于图像处理课程实验,用Matlab实现最主要的图像处理算法 本文章是Matlab图像处理系列的第二篇文章.介绍了空间域图像处理最主要的概念----模版和滤波器,给出了均值滤波起和中值滤波 ...