[笔记]深入解析Windows操作系统《三》系统机制(一)

简介: [笔记]深入解析Windows操作系统《三》系统机制

前言

Windows 操作系统提供了一些基本的机制供内核模式的组件 (比如执行体、内核和设备驱动程序) 使用。

本章将介绍下面的系统机制,同时说明如何使用这些机制:

  • 陷阱分发, 包括中断、延迟的过程调用 (DPC) 、异步过程调用 (APC) 、异常分发以及系统服务分发。
  • 执行体对象管理器。
  • 同步,包括自旋锁、内核分发器对象、等待是如何实现的,以及一些专门针对用户模式的同步原语 (它们不同于传统的同步对象,可避免切换至内核模式)。
  • 系统辅助线程。
  • 其他的机制, 比如 Windows 全局标志。
  • 高级的本地过程调用 (AL PC) 。
  • 内核事件跟踪。
  • Wow 64。
  • 用户模式调试。
  • 映像加载器。
  • 超级管理器 (Hyper-V) 。
  • 内核事务管理器 (KTM) 。
  • 内核补丁保护 (KPP) 。
  • 代码完整性。

第三章 系统机制

3.1 陷阱分发

中断异常是导致处理器转向正常控制流之外代码的两种操作系统条件。硬件或者软件都可以检测到这两种条件

术语陷阱 (trap) 指的是这样一种机制, 当异常或者中断发生时,处理器捕捉到一个执行线程, 并且将控制权转移到操作系统中某一固定地址处。在 Windows 中,处理器会将控制权转给陷阱处理器 (trap handler) 。

所谓陷阱处理器, 是指与某个特定的中断或异常相关联的函数。

图 3.1 显示了一些能激活陷阱处理器的条件。

内核按照下面的方法来区分中断和异常。

中断是一个异步事件 (可以在任何时候发生),并且与处理器当前正在执行的任务毫无关系。中断主要是由 1/O 设备、处理器时钟或者定时器产生的,并且可以被启用 (打开) 或者禁用 (关闭)。

相反地,异常是一个同步条件,它往往是一个特殊指令执行的结果。(中止 (abort)——比如机器检查,是一种典型的不与指令执行有关联的处理器异常。) 在同样的条件下用同样的数据第二次运行程序可以重现原来的异常。

异常的例子有:

  • 内存访问违例、
  • 特定的调试器指令,
  • 以及除零错误。

内核把系统服务调用也看作异常 (不过,从技术上讲,它们是系统陷阱)。

无论是硬件还是软件都能够产生异常和中断。 例如,总线错误异常是由于硬件问题引起的,而除零异常则是软件错误的结果。同样, 1/O 设备可以产生中断,内核本身也可以发出软中断 (比如 APC 或者 DPC,本章后面会讲到这些机制)。

当硬件异常或者中断产生时,处理器将在被中断的线程的内核栈中记录下足够多的机器状态信息,因而可以回到控制流中的该点处继续执行,就好像什么也没有发生过一样。如果该线程在用户模式下执行,那么 Windows 就切换到该线程的内核模式栈。然后, Windows 在被中断线程的内核栈上创建一个陷阱帧 (trap frame),并且把线程的执行状态保存到陷阱帧里。

陷阱帧是一个线程的完整执行环境的一个子集,在内核调试器中输入 dt nt!_ktrap_frame 就可以看到陷阱帧的定义(第 5 章“进程和线程”介绍了线程环境)。内核在处理软中断时,或者将软中断当作硬中断处理的一部分,或者当线程调用与软中断相关的内核函数时以同步方式进行处理。

在大多数情况下,内核安装了前端陷阱处理函数,在内核将控制权转交给与特定陷阱相关的处理函数之前或者之后,由这些前端陷阱处理函数来执行一些常规的陷阱处理任务。 例如,如果陷阱条件是一个设备中断,则内核的硬件中断陷阱处理器将控制权转交给一个由设备驱动程序提供给该中断设备的中断服务例程(ISR,interrupt service routine)。如果陷阱条件是因为调用一个系统服务而引发的,那么,通用的系统服务陷阱处理器将控制权转交给执行体中指定的系统服务函数。内核也会为它不希望看到的或者根本不处理的陷阱安装陷阱处理器。这些陷阱处理器一般的做法是执行系统函数 KeBugCheckEx,当内核检测到可能导致数据破坏的有问题行为或者不正确行为时,该函数会停止计算机(有关错误检查的更多信息,参见本书下册第 14 章“崩溃转储分析”)。

下面的章节将更加详细地介绍中断、异常和系统服务分发。

实验:将系统调用号映射到函数和参数


实验:查看系统服务的行为

通过观察“System”对象中的“System Calls/Sec”性能计数器,可以监视系统服务的行为。

运行性能监视器,然后在“监视工具”下单击“性能监视器”,再单击“添加”按钮在图表中加入一个计数器。

选择“System”对象,再选择“System Calls/sec”计数器,然后单击“添加” 按钮就可以将该计数器加入到图表中。

3.2 对象管理器

第2章“系统架构”中提到,Windows实现了一个对象模型,为执行体中实现的各种内部服务提供一致的、安全的访问机制。

本节将介绍Windows的对象管理器(object manager),即执行体内部负责创建、删除、保护和跟踪对象的组件。

对象管理器将那些本来有可能散落在操作系统各处的资源控制操作集中在一起,其设计意图是满足稍后列出的一系列目标。

实验:考察对象管理器


对象管理器的设计目标如下:

  • 提供一种公共的、统一的机制来使用系统资源。
  • 将对象保护隔离到操作系统中的一个地方,从而确保统一的、一致的对象访问策略。提供一种机制来管理进程对对象的使用,从而可以对系统资源的使用加以限制。
  • 建立一套对象命名方案,它可以很方便地融合已有的对象,比如设备、文件、文件系统中的目录,或者其他独立的对象集合。
  • 支持各种操作系统环境的需求,比如一个进程能够从它的父进程继承资源(Windows和UNIX应用子系统都需要这样的能力)、创建大小写敏感的文件名称的能力(UNIX应用子系统需要这种能力)。
  • 建立统一的规则来维护对象的保持力(也就是说,保持一个对象总是可用的,直至所有的进程都用完了这个对象为止)。
  • 提供为特定的会话隔离对象的能力,以便在名字空间中允许局部(local)全局(global)对象并存。

在内部,Windows有三种类型的对象:

  • 执行体对象、
  • 内核对象
  • GDI/User对象。

所谓执行体对象,是指由执行体的各个组件(比如进程管理器、内存管理器、IO子系统,等等)所实现的对象

内核对象是指由Windows内核实现的一组更为基本的对象

这些对象对于用户模式代码不可见,它们只是在执行体内部被创建和使用。

内核对象提供了最为基本的能力,比如同步等,执行体对象正是建立在它们之上。

因此,许多执行体对象包含(封装)了一个或者多个内核对象,如图3.18所示。

有关内核对象数据结构的细节,以及如何利用内核对象来实现同步的详细情况,本章后面会介绍。

在本节的余下内容中,我们将集中介绍对象管理器是如何工作的,以及执行体对象、句柄和句柄表的数据结构。

这里,我们也将粗略地描述一下对象是如何参与到Windows的安全访问检查机制中的,在第6章中我们将全面地讨论这一话题。

执行体对象

每个Windows环境子系统总是把操作系统的不同面貌呈现给它的应用程序。执行体对象和对象服务是环境子系统用于构建其自有版本的对象和其他资源的基础。

执行体对象 往往或者由环境子系统代表用户应用程序而创建,或者由操作系统的各种组件作为其常规操作的一部分而创建。例如,为了创建一个文件,Windows应用程序调用Windows的CreateFileW函数,该函数是在Windows子系统DLL Kernelbase.dlI中实现的。在经过一些验证和初始化工作以后,CreateFileW又依次调用原生的Windows服务NtCreateFile来创建执行体文件对象。

环境子系统提供给其应用程序的对象集合可能比执行体提供的要大–些,也可能小-一些。Windows子系统使用执行体对象来导出自己的对象集合,其中许多对象直接对应于执行体对象。例如,Windows的互斥体和信号量直接建立在执行体对象之上,而这些执行体对象又建立在对应的内核对象之上。另外,Windows子系统提供了命名管道(named pipe)邮件槽(mailslot),以及资源( resource),它们都建立在执行体文件对象基础之上。

有些子系统,比如UNIX应用子系统,甚至根本不提供对象方式的支持。UNIX应用子系统使用执行体对象和服务作为基础,来向其应用程序表达UNIX风格的进程、管道和其他资源。

表3.8 列出了执行体提供的基本对象,并简要地描述了它们所代表的含义。在本书后面专门讲述有关执行体组件的章节中,可以找到更多有关执行体对象的细节(如果执行体对象被直接导出至Windows子系统,那么可以在Windows API参考文档中找到有关的细节。) 也可以用提升的权限来运行Winobj,并转换到ObjectType目录,然后就可以看到完整的对象类型列表。

注:

执行体总共实现了42种对象类型。这些对象中有许多仅被用于其定义所在的执行体组件,无法通过Windows API直接访问。这样的对象例子包括驱动程序(Driver)、 设备(Device)和事件对(EventPair)。

注:

由于Windows NT最初设计时要求支持OS/2操作系统,因此,互斥体必须要跟OS/2互斥体对象已有的设计保持兼容,OS/2的设计要求一个线程能够舍弃互斥体对象,使它不可再被访问。由于这种行为对于互斥体对象来说被认为是非同寻常的,因此,Windows创建了另一个内核对象,即突变体(mutant)。 最终,对OS/2的支持被放弃了,该对象被Windows 32子系统用于互斥体(mutex),但是在内部它仍然被称为突变体。

如图3.19所示,每个对象都有-一个对象头和一个对象体。对象管理器控制了对象头,而执行体组件则控制了由它们所创建的对象类型的对象体。

每个对象头中也有一个索引,指向一个被称为类型对象(typeobject)的特殊对象,该对象包含的信息对于它的每个实例是公共的。

另外,还可以有多达五个可选的子头:

  • 名称信息头、
  • 配额信息头、
  • 进程信息头、
  • 句柄信息头
  • 创建者信息头。

对象头和对象体

对象管理器使用对象头中保存的数据来管理这些对象,而无须涉及其类型。

表3.9简要地描述了对象头的域,表3.10描述了可选的对象子头中的域。

对象头中包含的信息适用于任何类型的对象,除此之外,子头中包含的可选信息仅涉及对象的某些特定的方面。

注意,这些结构的位置是从对象头的开始处加上-一个并不固定的偏移量,此偏移值取决于与主对象头相关联的子头的数量(如上所述,除了创建者信息)。对于每一个出现在对象头部的子头,InfoMask域相应地做更新,以反映出该子头存在于对象头部。对象管理器在检查指定的子头时,先检查InfoMask中对应的位是否已被设置,然后利用余下的位,从ObpInfoMaskToOffset表中选择出正确的偏移,这样就可以找到距离对象头开始处的偏移量。

对于所有子头各种可能的组合情形,都存在相应的偏移量,但是,因为子头(如果存在)总是按照固定不变的顺序来分配,所以,对于一个给定的头,它可能出现的位置的数量,与优先于它而出现的最多子头数量相同。例如,因为名称信息子头总是最先分配的,所以,它只有-一个可能的偏移量。另一方面,句柄信息子头(第三优先分配)有三个可能的位置,因为它可能在配额子头之后分配,也可能不在配额子头之后;而这也可能在名称信息之后分配。

表3.10 描述了所有可选对象子头和它们的位置。对于创建者信息的情形,对象头标志中有一个值指明了该子头是否存在。(关于这些标志的信息,参见表3.12。)这些子头中的每一个都是可选的,只有在特定的条件下才会出现,可能在系统引导期间,也可能在对象创建时。表3.11描述 了这些条件。

最后,许多属性和/或标志决定了对象在创建时或某些特定操作过程中的行为。任何一个新对象在被创建时,对象管理器都会在-一个称为对象属性(objectattribute)的结构中接收到这些标志。此对象属性结构定义了对象名称、将来被插入处的根对象目录、对象的安全描述符,以及对象属性标志(object attribute flag)。

表3.12列出了各种可以与一个对象关联起来的标志。

注:

当通过Windows 子系统中的API函数(比如CreateEvent或CreateFile)来创建对象时,调用者并不指定任何对象属性一子 系统DLL将在背后完成这些事情。由于这个原因,所有通过Win32创建的有名称的对象都将进入BaseNamedObjects目录中(无论是全局实例,还是每个会话的实例),因为这是Kernelbase.dll在对象属性结构中指定的根对象目录。有关BaseNamedObjects及其如何与会话名字空间关联起来的更多信息,参见本章后面的介绍。

除对象头外,每个对象还有一个对象体,其格式和内容都取决于其对象类型:同一类型的所有对象共享同样的对象体格式。执行体组件通过创建一一个对象类型,并为其提供必要的服务,便可以控制所有该类型的对象体的数据。因为对象头有-一个静态的、确定的大小,所以,对象管理器可以很容易地为-一个对象找到它的对象头,做法很简单,从对象指针上减去头的大小。正如前面所解释的那样,要想访问对象的子头,对象管理器只需从对象头的指针再减去另一个确定的值即可。

由于对象头和子头结构已被标准化,因此对象管理器可以提供少量通用的服务对一个对象头中保存的属性进行操作,而且这些服务可以作用在任何类型的对象上(不过,有些通用服务对于某些特定的对象并没有意义)。

表3.13中 列出了这些通用的服务,Windows子 系统允许其中的某些服务直接被Windows应用程序使用。虽然所有的对象类型都支持这些通用的对象服务,但是,每个对象都有其自己的创建、打开和查询服务。例如,I/O系统为其文件对象实现了一个创建文件的服务,而进程管理器则为其进程对象实现了一个创建进程的服务。尽管实现一个通用的创建对象的服务也是有可能的,但是这样的例程将会相当复杂,因为,举例而言,初始化–个文件对象与初始化一个进程对象,所需要的参数集合会有极大的差异。而且,每次线程调用对象服务来确定句柄所指对象的类型,再调用正确版本的服务时,对象管理器都将招致额外的处理开销。

对象头中包含的数据对于所有的对象都是公共的,但是每个对象实例可以取不同的值。

类型对象

例如,每个对象有一个唯一名称, 也可以有唯一-的安全描述符。然而,对象也可以包含一些对于某种特定类型的所有对象皆为常数的数据。例如,当打开一个指向某种类型的对象的句柄时,可以从一-组特定于该对象类型的访问权限中进行选择。执行体为线程对象提供了终止和挂起(及其他)访问操作,为文件对象提供了读、写、添加和删除(及其他)访问操作。与对象类型相关的属性的另-一个例子是同步,稍后会介绍。

为了节省内存,对象管理器只在创建新的对象类型时,才存储这些静态的、特定于对象类型的属性。它使用自己的一个对象(一个类型对象)来记录这些数据。

如图3.20所示,如果对象跟踪调试标志(参见本章后面的“Windows全局标志”一节所述)被设置,则类型对象也会将同一类型(在图中是进程类型)的所有对象链接起来,从而使对象管理器可以在必要的时候找到这些对象,并且对它们进行枚举。这- .功能利用了前面讨论过的创建者信息子头。

实验:查看对象头和类型对象


在用户模式下不能操纵类型对象,因为对象管理器并没有提供任何有关类型对象的服务。

然而,类型对象定义的某些属性通过特定的原生服务或者WindowsAPI例程是可见的。表3.14

列出了在类型初始化结构中保存的信息。

同步是一个对于Windows应用程序可见的属性,它指的是,一一个线程通过等待某个对象从一.种状态改变成另–种状态,从而达到同步其执行过程的能力。–个线程可以通过执行体的作业、进程、线程、文件、事件、信号量、互斥体和定时器对象来进行同步。其他的执行体对象不支持同步。

一个对象支持同步的能力,基于以下三种可能性:

  • 该执行体对象是一个分发器对象的包装对象,它包含-一个分发器头;分发器头是一个内核结构,本章后面“低IRQL的同步”一节中将进一步介绍。
  • 对象类型的创建者请求-一个默认对象,而对象管理器提供默认对象。
  • 执行体对象有一个内嵌的分发器对象,比如在对象体内部某处的一个事件;该对象的所有者在注册此对象类型时向对象管理器提供了此内嵌对象的偏移量(参见表3.14中的描述)。
相关文章
|
5天前
|
网络安全 C++ Windows
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
【Windows驱动开发】(主机)VS2017+(虚拟机)win10系统------双机调试
|
11天前
|
搜索推荐 Android开发 iOS开发
深入解析安卓与iOS操作系统的异同
安卓和iOS是目前两大主流移动操作系统,它们分别代表了开放性和封闭性的设计理念。本文将从系统架构、用户界面、应用生态等方面深入探讨安卓和iOS之间的异同,帮助读者更好地理解这两个操作系统的特点和优势。
24 3
|
11天前
|
编解码 安全 网络安全
RealVNC的 VNC server在windows7系统下无法正确运行
在Windows 7上运行旧版VNC Server(如4.1.2)可能存在兼容性问题,但可通过调整配置解决。步骤包括:安装VNC Server,设置兼容性模式(选择Windows XP SP3),启动VNC Server,配置VNC连接参数。若遇到问题,检查防火墙设置,确保系统更新,并考虑升级到新版VNC Server以提高性能和兼容性。
|
17天前
|
Windows
windows系统bat批处理 打开乱码
windows系统bat批处理 打开乱码
|
1天前
|
网络协议 Linux 编译器
【原创】EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统移植指南
EtherCAT主站方案对比:商业的如Acontis、TwinCAT3和开源的igh、SOEM。SOEM易移植但功能和实时性不足,适合简单应用;igh功能强大,实时性能优秀,基于内核态,适合复杂场景。igh能移植到其他RTOS,但需克服多任务无调度的挑战。依赖操作系统服务如定时器、内存分配,适合Linux内核,但移植到裸机复杂。
|
17天前
|
存储
操作系统:管程与进程通信机制解析
操作系统:管程与进程通信机制解析
14 0
|
18天前
|
存储 Linux 数据处理
探索Linux操作系统的内核与文件系统
本文深入探讨了Linux操作系统的核心组件,包括其独特的内核结构和灵活的文件系统。文章首先概述了Linux内核的主要功能和架构,接着详细分析了文件系统的工作原理以及它如何支持数据存储和检索。通过比较不同的文件系统类型,本文旨在为读者提供一个关于如何根据特定需求选择合适文件系统的参考框架。
|
8天前
|
存储 缓存 安全
Linux基础——冯诺依曼体系结构与操作系统
Linux基础——冯诺依曼体系结构与操作系统
34 1
Linux基础——冯诺依曼体系结构与操作系统
|
4天前
|
Linux 网络安全 虚拟化
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
|
9天前
|
网络协议 Linux 数据安全/隐私保护
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位

热门文章

最新文章