精华内容
下载资源
问答
  • Windows内核的基本概念

    2020-12-07 21:17:38
    Windows内核的基本概念 1 处理器模式 Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode);3 表示用户模式(user mode)。 1.1 内存管理 Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间...

     Windows内核的基本概念

    1  处理器模式

    Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode);3 表示用户模式(user mode)。

    1.1  内存管理

    Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间看待。其中2~4GB是所有进程共享的,为系统地址空间。0~2GB 为进程地址空间。

    在系统地址空间中,典型的三种内存页面管理算法:

    1. 非换页内存池。这部分内存区域在初始化时已经被映射到物理页面,所以Windows利用空闲链表的做法,按照不同的粒度(1、2、3、>=4 个页面的大小),将空闲页面链接起来,空闲页面本身即链表的结点,申请和释放页面的操作实际上是针对空闲链表来进行的。
    1. 换业内存池。在换页内存池区域,空闲的页面并没有被映射好物理页面,Windows使用位图来管理页面的分配。分配连续的多个页面,即从位图中找到连续的零位。
    2. 系统PTE区域。把PTE当作资源来管理。当内核需要一段虚拟地址来映射物理页面时,它可以使用系统PTE区域中的地址。

    1.2  进程和线程管理

    进程定义了一个执行环境,包括私有的地址空间、一个句柄表、以及一个安全环境。

    线程则是一个控制流,有自己的调用栈,记录了它的执行历史。

    Windows 中的进程和线程的关系:

     

    1.3  中断和异常

    中断(interrupt) 是处理器与外部设备打交道的重要途经; 异常(exception) 是处理器的正常指令流在执行过程中产生的一下特殊事件,需要紧急处理才能继续原来的指令流。

    Intel x86 利用IDT(Interrupt Descriptor Table,中断描述符表),将中断或异常与一个处理服务例程关联,一旦发生中断或异常,该服务例程即被执行。

    Windows 允许设备驱动程序为特定的中断向量添加它的中断服务例程(ISR ,Interrupt Service Routine)。

    Windows 规定了一套软件中断优先级,称为中断请求级别(IROL,Interrupt Request Level),Windows 使用0~31来表示IRQL,数值越大,优先级越高。

    IRQL=0 表示普通线程,称为PASSIVE_LEVEL或被动级别;

    IRQL=1 表示异步过程调用(APC ,Asynchronous Procedure Call),称为APC_LEVEL;

    IRQL=2 表示延迟过程调用(DPC,Deferred Procedure Call),称为DISPATCH/DPC或者DISPATCH_LEVEL。

    3~26是设备IRQL,27~31是一些特殊的硬件中断。

    内核模式异常处理:异常分发器首先将异常交给内核调试器来处理,若不存在内核调试器或者内核调试器没有处理该异常,则尝试分发到一个基于帧的异常处理器(frame-based exception handler)。

    用户模式异常处理:异常分发器首先判断进程的调试端口是否有效,若有效,则发送消息至调试端口,然后等待应答,否则将异常交给内核调试器。如果异常仍未得到处理,则将控制转到用户模式下,由用户模式的异常分发器(ntdll.dll 中的KeUserExceptionDispatcher 函数)寻找一个基于帧的异常处理器。如果在用户模式下该异常仍为得到处理,则控制再次回到内核模式下。这次,内核模式的异常处理器首先尝试调试端口,若异常仍未被处理,则再尝试当前进程的异常端口。连接进程异常端口的是Windows子系统,因此,Windows子系统在异常处理的最后时刻由机会处理它所属进程的异常。如果它也不能处理,则该进程被终止。

    1.4  同步

    同步是为了解决并发访问。windows操作系统提供多种多种同步机制,根据执行环境中的IRQL值大于APC_LEVEL或者等于PASSIVE_LEVEL,可以将同步分为“不依赖线程调度的同步机制”和“基于线程调度的同步机制”两类。

    当IRQL大于APC_LEVEL时,Windows提供了一些方便的同步保护机制,供内核自身或设备驱动程序使用。IRQL大于APC_LEVEL时典型的同步机制如下:

    1. 提升IRQL。根据IRQL的定义,当处理器在某个IRQL上运行时,他只能被更高IRQL的中断打断,意味着,不用担心低IRQL的过程会抢占掉当前执行过程。这种做法在单处理器系统上可以做的更好,但是多处理器系统上,提升IRQL还不够,往往还需要其他同步机制(如自旋锁)。
    2. 互锁操作。利用Intel X86处理器提供的lock指令前缀,可以实现基于整数操作的保护,确保一个操作以原子方式进行。这种操作只能在小粒度数据上(可以达到64位内存单元)进行同步保护,而且是指令级保护。
    3. 无锁的单链表。windows利用64位互锁指令来实现无锁的单链表数据结构,支持多核,多处理器环境。
    4. 自旋锁(spin lock)。自旋锁本身是一种忙等。为了获得自旋锁,处理器持续监测锁状态。直至可用。此时即使有线程调度执行,APC排队,也没机会执行。所以自旋锁通常用于IRQL大于等于DISPATCH_LEVEL的代码。windows还提供一些自旋锁的扩展:执行体自旋锁(支持共享和独占的语义),排队自旋锁(queued spin lock)和栈内排队自旋锁(in-stack queued spin lock)。

    IRQL值等于PASSIVE_LEVEL线程之间的同步。

    windows定义了统一的机制支持各种线程同步原语:分发器对象(dispatcher object),其数据结构头部为DISPATCH_HEADER。

    windows Server 2003 实现了以下分发器对象:

    1. 事件(event):分为事件通知对象和事件同步对象,区别在于,当事件对象变成有信号状态时,是解除所有正在等待该对象的线程,还是只唤醒第一个以WaitAny方式等待该对象的线程。
    2. 突变体(mutant):突变体是Windows内核中互斥体的实现,如果突变体对象为无信号状态,则一定被某个线程“占有”,否则可满足任何一个线程的等待要求。突变体记录了“所有者”线程信息,通常可用于实现“锁”。
    3. 信号量(semaphore):信号量有一个计数器,用于控制最多可以有多少个线程共享一个资源。当计数器达到预定最大值时,信号量将变成无信号状态。
    4. 队列对象(queue):这是Windows内核中用于支持线程池的机制,其数据结构为KQUEUE,通常可以用于控制一项任务的并发程度。它的典型用途是I/O完成端口。
    5. 进程对象:Windows的内核进程对象本身也是一个分发器对象,当进程对象被初始创建时,为无信号状态,进程结束为有信号状态。
    6. 线程对象:同理如上。
    7. 定时器对象:定时器对象既是一个像DPC一样的例程,也是个可等待的分发器对象,当设定的时间到期时,定时器变成有信号状态。
    8. 门对象(gate object):在windows中,门对象和门等待时线程调度器的特殊支持,它绕过了以上分发器对象同步过程中的很多步骤。唤醒一个门等待的线程几乎是以最快捷的方式进行,线程调度器会直接将线程插入到某个处理器的就绪队列中。

    除此之外,还有更丰富的同步机制:包括,快速互斥体(fast mutex),守护互斥体(guarded mutex),执行体资源(executive resource)和推锁(push lock)。

    展开全文
  • windows内核原理与实现

    千次阅读 2018-02-03 17:16:57
    2.windows内核的基本概念  2.1处理器模式 intelx86处理器:0-最高级特权,cpu处在内核模式,可以访问当前进程的地址空间和系统空间;3-最低特权, 处在用户模式, 只能访问当前进程的地址空间。 2.2内存...

    本文章是作者本人在学习《windows原理与实现》一书时的一些总结和笔记

    第二篇:windows系统总述

    2.windows内核的基本概念

     2.1处理器模式
    intelx86处理器:0-最高级特权,cpu处在内核模式,可以访问当前进程的地址空间和系统空间;3-最低特权,
    处在用户模式,
    只能访问当前进程的地址空间。
    2.2内存管理
    共享的系统地址空间和私有的进程地址空间。
    windows使用页表机制来访问虚拟内存,一旦页表项不在物理内存中,触发页面错误异常,将对应页面换入
    物理内存。
    2.3进程和线程管理
    进程和线程的核心机制在微内核的中实现,管理机制在执行体中完成。windows实现了基于优先级的抢占式
    线程调度算法,每个线程都有一个基本优先级和动态优先级,优先级为0-31直接,0为系统优先级,最低,
    1-15为动态优先级,线程的动态优先级可以在此范围内微调,16-31为实时优先级,用于一些实时处理任务。
    2.4中断和异常
     中断时处理器与外部设备打交道的途径,而异常时处理器的正常指令流在执行过程中产生的一些特殊事件。
     Intel x86都利用中断描述表(IDT),将每个中断或异常与一个处理该中断或异常的服务例程联系起来。
     在此硬件机制的基础上,通过一种中断对象机制,允许设备驱动程序为特定的中断向量添加中断服务例程(ISR),
     一个中断向量允许连接多个中断对象(一种封装了中断服务例程的内核对象)
     软件中断优先级的问题:中断请求级别,使用0-31来表示,数值越大优先级别越高;处理器在运行时有一个
    当前中断请求级别中断源的中断请求级别等于或低于当前级别,则该中断被屏蔽。
     windows为所有需要处理的异常都提供了异常处理器(即异常处理例程),当代码发生异常时,异常分发器会
    对异常进行分发,根据处理器模式的不同,分发过程也不同。
     2.5同步
     根据执行环境中的中断请求级别(IRQL)大于APC_LEVEL(1,表示异步过程调用)或者等于PASSIVE_LEVEL
    (0,普通线程)可以将同步机制分为:不依赖于线程调度同步机制和基于线程调度的同步机制。



    展开全文
  • Windows内核之线程简介

    千次阅读 2014-05-26 01:55:02
    1 线程定义 内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方 另一个是线程堆栈,它用于维护线程在执行代码时需要的...线程共享进程的地址控件 线程只有一个内核对象和一个堆栈

    1 线程定义

    <1> 内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方

    <2>另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量.

    2 线程和进程的区别

    <1>进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。

    <2>线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。

    <3>线程共享进程的地址控件

    <4>线程只有一个内核对象和一个堆栈,保留的记录很少,开销比进程少很多。

     

    3 线程函数

    线程分为主线程以及一般线程。主线程的入口点函数必须是main,wmain,WinMain,wWinMain,一般线程函数则可以随便命名。并且必须要有一个函数返回值。

     

    4 创建线程

    HANDLE CreateThread( 
      LPSECURITY_ATTRIBUTES   lpThreadAttributes,       // SD
     SIZE_T         dwStackSize,                       // initial stack size
     LPTHREAD_START_ROUTINE      lpStartAddress,    // thread function
     LPVOID         lpParameter,            // thread argument
     DWORD      dwCreationFlags,         // creation option
      LPDWORD   lpThreadId              // thread identifier);

    <1>lpThreadAttributes

    指向一个SECURITY_ATTRIBUTES的指针,指定安全属性,当为NULL的时候,会利用系统默认的安全属性

    <2> dwStackSize

    设置线程栈的初始大小,以字节为单位,系统会把它四舍五入到页面大小的最近值,当设置为NULL 的时候,会采取系统的默认值。

    <3> lpParameter

    指向应用程序定义的LPTHREAD_START_ROUTINE类型的函数的指针,这个函数将有新线程执行,表示线程的新的起始地址。指定一个函数做位新线程的入口地址,函数的名称任意,但是类型必须按照下面的格式:

    DWROD   WINAPI    ThreadProc(LPVOID lpParameter);

    <4> lpParameter

    传递给线程的参数

    <5> dwCreationFlags

    设置用于线程创建的附加标记。是CREATE_SUSPENDED或者0两者之一,如果是CREATE_SUSPENDED表示线程不立即执行,知道ResumeThread函数开始执行。

    <6> lpThreadId

    这是一个返回值,用于表示函数的线程ID。

     

    系统给线程分配的堆栈是从进程的地址空间中分配的,所有线程共享进程地址空间,他们之间通信很方便。

    注意:CreateThread是Windows函数,如果要编写C/C++的多线程函数,那么就需要使用_beginTreadx函数

     

    5 线程的终止运行

    <1>线程函数的返回

    <2>通过ExitThread函数撤销线程,不过最好不用

    <3>同一个进程或者另一个进程中的线程调用TerminateThread函数,应该避免用

    <4>包含线程的进程的终止运行,应该避免用

    5.1 线程函数返回时做的事情

    <1>在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消

    <2>操作系统将正确地释放线程堆栈使用的内存

    <3>系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值

    <4>系统将递减线程内核对象的使用计数

    5.2 ExitThread 函数

    它能够使操作系统清除所有的操作系统资源,包括线程的堆栈,但是C++资源将不会被撤销

    5.3 TerminateThread 函数

    这个函数能够停止任何线程,但是它不会发送任何通知消息给将要撤销的线程,并且它是异步的,不能保证函数返回的时候,函数线程已经被终止。在进程终止前,线程的堆栈是不会被清除的,这样方便其他线程使用。

    5.4 进程终止时线程的终止

    同样的问题是进程强制终止,会造成

    5.5 线程终止时候发生的事情

    <1>线程的退出代码从S T I L L _ A C T I V E改为传递给E x i t T h r e a d或Te r m i n a t e T h r e a d的代码

    <2>线程内核对象的状态变为已通知

    <3>如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行

    <4>线程内核对象的使用计数递减1

     

    注意:通过检查线程句柄的推出去代码可以检查线程是否已经终止。响应的函数是:

    BOOL GetExitCodeThread(HANDLE hThread,LPDWORD lpDword)

    展开全文
  • 概括而言,设备驱动程序有以下三种基本类型: l 即插即用驱动程序(也称为WDM 驱动程序,见下文介绍)。这一类驱动程序通常是为了驱动硬件设备而由硬件厂商提供...l 内核扩展驱动程序(也称为非即插即用驱动程序)


     概括而言,设备驱动程序有以下三种基本类型:

    即插即用驱动程序(也称为WDM 驱动程序,见下文介绍)。这一类驱动程序通常是为了驱动硬件设备而由硬件厂商提供,它们与Windows 的I/O 管理器、即插即用管理器和电源管理器一起工作。Windows 自身随带了大量即插即用驱动程序,用于支持各种常见的存储设备、视频适配器、网络适配器、输入设备等。

    内核扩展驱动程序(也称为非即插即用驱动程序)。这一类驱动程序用于扩展内核的功能,或者提供访问内核模式代码和数据的一种途径。它们并没有集成到即插即用管理器和电源管理器的框架中。在引入即插即用管理机制以前开发的驱动程序都属于这一类型。现在仍然有大量的内核扩展驱动程序。

    文件系统驱动程序。这一类驱动程序接收针对文件的请求再进一步将请求转变成真正对于存储设备或网络设备的I/O 请求,从而满足原始的文件请求。

    Windows 的即插即用管理器是I/O 系统的一部分,它负责即插即用设备的内核支持,其职责是:自动检测设备的插入和移除;动态地分配硬件资源,例如中断、I/O 端口和I/O寄存器;指示I/O 管理器为设备加载正确的驱动程序;向内核及应用程序提供有关设备插入和移除的通知机制。即插即用管理器根据总线和设备的功能分工,定义了一个驱动程序模型,让总线和设备的驱动程序协作完成设备的列举、插入和拔除等管理工作。支持这一模型的驱动程序称为WDM(Windows Driver Model)驱动程序,共有三种类型:总线驱动程序功能驱动程序过滤驱动程序。总线驱动程序既负责管理总线上的设备(配合即插即用管理器),也为总线上的设备提供了访问总线资源的方法。功能驱动程序负责管理具体的设备,向操作系统提供该设备的功能。过滤驱动程序的用途是监视一个设备的I/O请求及其处理过程,甚至增加或改变一个设备或驱动程序的行为。

    在WDM 中,每个硬件设备都有一个设备驱动程序栈(简称设备栈),其中包含一个总线驱动程序和一个功能驱动程序,以及零个或多个过滤驱动程序。即插即用管理器在设备列举过程中,依照总线与设备之间的关系,构建起一棵设备树,其中包含当前系统中所有被检测到的总线和设备。设备树的每一个节点都代表一个实际的设备,该设备的设备栈为其提供软件服务,操作系统(实际上是I/O 管理器)通过设备栈来访问或操纵设备

    非即插即用驱动程序的用途多种多样,其中内核扩展是最自然的用法。例如,许多系统工具使用内核扩展类型的驱动程序来获得Windows 内核中的各种系统信息,或者创建系统线程以便在系统进程环境中执行任务。另外,在Windows 内核中,也有一些模块虽然以“.sys”作为文件扩展名,但它们其实并非设备驱动程序,而是单纯的内核扩展动态链接库,供其他的驱动程序或者内核模块调用。

    有关Windows 中I/O 管理器、即插即用管理器、电源管理器以及设备驱动程序的进一步介绍,可参考第6 章。

    文件系统/存储管理

    在现代操作系统中,文件系统是外部存储设备的标准接口,它为应用程序使用这些设备中的数据提供了统一的抽象,多个应用程序和系统本身可以共享使用这些设备。在Windows 中,文件系统的接口部分由I/O 管理器定义和实现,但文件系统的实现部分位于专门的一类驱动程序中。当文件系统接收到I/O 请求时,它会根据文件系统格式规范,将这些请求转变成更低层的对于外部存储设备的I/O 请求,通过它们的设备驱动程序来完成原始的I/O 请求。因此,文件系统的驱动程序定义了外部存储设备中数据的逻辑结构,使得这些数据可直接被操作系统和应用程序使用。

    Windows 的原生文件系统是NTFS(NT File System),其驱动程序为ntfs.sys。NTFS是专门为Windows 设计的文件系统格式,它提供了安全性、可靠性、大容量支持、长文件名支持,以及可恢复性等一系列高级特性,目前广泛应用于Windows 系统。另一个常用的文件系统格式是FAT(File Allocation Table),这是从DOS 时代发展起来的文件系统格式,格式规范相对比较简单,目前仍在使用,主要用于兼容老版本的操作系统,以及用于移动设备以便跨操作系统传送数据。

    在Windows 中,每个文件系统实例有它自己的设备栈,因而通过插入过滤驱动程序可以过滤文件I/O 请求。Windows 支持两种形式的过滤驱动程序:一种直接插入到设备栈中,从而能够看到每一个经过设备栈的文件I/O 请求;另一种基于Windows 提供的过滤管理器驱动程序(FltMgr)的I/O 过滤框架,称为文件系统小过滤驱动程序,它们并不出现在文件系统设备栈中,而是以回调方式来响应FltMgr 的事件。

    文件系统的底层是对存储设备的管理。大容量存储设备以“分区(partition)”和“卷(volume)”来管理整个存储空间。分区是指存储设备上连续的存储区域(连续的扇区),而卷是指扇区的逻辑集合。一个卷内部的扇区可能来自一个分区,也可能来自多个分区,甚至来自不同的磁盘。文件系统则是卷内部的逻辑结构。因此,Windows 的存储管理形成了一个存储栈,最接近于应用程序的是文件系统,接下来是卷管理部分,最接近于存储设备的是分区管理和磁盘驱动程序

    磁盘设备是典型的即插即用设备,其设备栈和驱动程序符合WDM 规范。即插即用管理器在设备列举过程中建立起每个磁盘设备的设备栈。设备栈的最底下是总线驱动程序,最上方是一个称为分区管理器的驱动程序,负责通知即插即用管理器当前磁盘上有哪些分区,因而系统中的卷管理器可以接收到有关分区创建和删除的通知。这样,每个物理分区与卷管理器联系起来,卷管理器再将卷与文件系统关联起来,就形成了完整的存储栈。

    有关Windows 中文件系统和存储管理的进一步介绍,可参考第7 章。

    网络

    网络虽然并非Windows 操作系统中必不可少的组成部分,但实际上,它已经成为绝大多数Windows 系统的标准配置。Windows 为应用程序提供了多种网络API,允许应用软件设计人员根据他们的需求适当选择。以下是Windows 平台上主要的网络API:

    Windows 套接字,简称Winsock。它实现并扩展了BSD 套接字标准。Winsock 2.0 版本支持一些新特性,比如异步网络I/O、服务质量(QoS)规范、可扩展名字空间,以及多点消息传输等。

    WinInet。这是一个高层网络API,它支持多个协议,包括Gopher、FTP 和HTTP。Microsoft Internet Explorer 使用WinInet 来完成数据传输。

    命名管道(named pipe)和邮件槽(mailslot)。用于不同进程之间进行通信。它们支持不同机器上的进程之间相互通信。命名管道支持连接方式的通信模型;邮件槽支持非连接方式的通信模型,客户进程可以发送广播消息。

    NetBIOS。这是一个早期的网络编程API,Windows 支持NetBIOS 是为了兼容老的应用程序。NetBIOS 支持有连接的通信和无连接的通信。

    RPC。这是网络编程的一个标准,往往是分布式系统基础设施的重要组件。RPC 建立在其他的网络API 基础之上,比如命名管道和Winsock。Windows 的RPC 支持异步调用方式。

    这些网络API 都提供了用户模式的动态链接库(DLL),当应用程序通过这些DLL发出网络I/O 请求时,它们必须将接收到的请求传递给内核模式下的相应驱动程序。通常,这些网络API 要么通过专门的系统服务切换到内核模式,比如命名管道和邮件槽就有专门的系统服务;要么通过标准的系统服务接口,比如NtReadFile、NtWriteFile 和NtDeviceIoControlFile,由I/O 管理器和对象管理器将网络请求转送至对应的驱动程序中。

    Winsock 是Windows 最重要的网络API,它的用户模式部分不仅包含了一个DLL(即ws2_32.dll),还定义了一个可扩展的框架,允许第三方插入传输服务提供者和名字空间服务提供者,以支持更多的传输服务和名称解析或地址映射能力。Winsock 默认支持TCP/IP、IPX/SPX、AppleTalk 和ATM 等协议,它提供的传输服务和名字空间服务都通过内核模式驱动程序afd.sys 实现网络通信。

    在内核模式部分,网络API 驱动程序(譬如afd.sys)通过传输驱动程序接口(TDI,Transport Driver Interface)与协议驱动程序进行通信。TDI 实际上是一组预定义的I/O 请求,它描述了各种网络请求,包括名称解析、建立连接、发送和接收数据等。网络API驱动程序是TDI 客户,而传输协议驱动程序实现了TDI 接口,称为TDI 传输器。TDI 客户与TDI 传输器之间是松耦合关系。一个TDI 传输协议驱动程序可以被多个TDI 客户使用。例如,TCP/IP 驱动程序为tcpip.sys,它既可以被Winsock 驱动程序afd.sys 使用,也可以被netbt.sys 驱动程序使用。Windows 不仅实现了基本的TCP/IP,还支持NAT(网络地址转译)、IP 过滤以及IPSec 规范等协议扩展,这些协议扩展也是内核驱动程序,它们通过私有的接口与tcpip.sys 进行通信。

    在Windows 中,网络协议与网络适配器驱动程序是分开的协议驱动程序独立于任何一个网络适配器,而真正发送和接收数据是通过网络适配器进行的。协议驱动程序通过统一的接口与适配器驱动程序进行通信,此接口是NDIS(Network Driver InterfaceSpecification)。符合NDIS 的网络适配器驱动程序称为NDIS 驱动程序,或NDIS 小端口驱动程序(NDIS miniport driver)。Windows 提供了NDIS 库,即ndis.sys,作为协议驱动程序与NDIS 驱动程序两者之间的桥梁。随Windows XP 和Windows Server 2003 一起发行的NDIS 库是NDIS 5.1;随Windows Vista 一起发行的NDIS 库是NDIS 6。

    NDIS 客户(即TDI 传输器)利用NDIS 库提供的功能,对将要发送给NDIS 驱动程序的命令进行格式化,并发送给NDIS 驱动程序;而NDIS 驱动程序则利用NDIS 库,接收请求和送回应答。NDIS 驱动程序并非标准的设备驱动程序,它们通过NDIS 库与NDIS客户进行通信,I/O 管理器并不介入两者之间的通信过程。

    有关Windows 网络体系结构的进一步介绍,可参考9.1 节。

     

    来源: <http://book.51cto.com/art/201011/235711.htm>

     

    2.2.3 Windows 子系统

    按照Windows NT 最初的设计,它支持三个环境子系统:OS/2、POSIX 和Windows(或称为Win32)。然而,Windows 子系统是必须要运行的,没有它Windows 系统无法运行,而其他两个子系统则被配置成按需启动。而且,到了Windows XP以后,只有Windows子系统随Windows 系统一起发行。这一节将介绍Windows 子系统的概况,更详细的信息,请参考9.2 节。

    在Windows 平台上,可执行映像文件的格式为PE 文件格式[PE-SPEC](参见上一小节中插入的关于PE 文件格式的介绍),其头部域Subsystem 指定了该应用程序将被运行在哪个环境子系统中。Microsoft Visual Studio 的链接器(linker)支持/SUBSYSTEM 命令选项,由它来指定子系统的类型。例如,该域为2 说明这是一个Windows GUI 应用程序,为3则是Windows 控制台应用程序(Windows CUI)。

    Windows 子系统中既有用户模式部分,也有内核模式部分。内核模式部分的核心是win32k.sys,虽然它的形式是一个驱动程序,但实际上它并不处理I/O 请求,相反,它向用户代码提供了大量的系统服务。从功能上讲,它包含两部分:窗口管理和图形设备接口(GDI)。其中窗口管理部分负责收集和分发消息,以及控制窗口显示和管理屏幕输出;图形设备接口部分包含各种形状绘制以及文本输出功能

    用户模式部分包括Windows 子系统进程(csrss.exe)以及一组动态链接库(DLL)。Csrss.exe 进程主要负责控制台窗口的功能,以及创建或删除进程和线程等。子系统DLL则被直接链接到应用程序进程中,包括kernel32.dll、user32.dll、gdi32.dll 和advapi.dll 等,负责实现已文档化的Windows API 函数。除了有些可以直接在用户模式中完成以外,很多API 函数需要调用执行体API 或win32k.sys 模块提供的系统服务

    Win32k.sys 一方面向用户代码提供系统服务,另一方面也跟Windows 内核紧密地融合在一起。它通过向内核注册一组出调(callout)函数,以便介入到内核的线程和进程管理等处理逻辑中,同时也可以接收电源事件。对于每个线程,一旦它调用了win32k.sys的任何一个系统服务,就变成了一个GUI 线程,从而纳入到了Windows 子系统的线程和进程管理范畴。Windows 内核的线程和进程数据结构为Windows 子系统预留了一些域,从而win32k.sys 可以方便地操纵它的线程和进程。

    下面从窗口管理和图形设备接口两方面来介绍Windows 子系统的核心功能和结构。

    窗口管理

    Windows 子系统的用户界面管理有一个层次结构,通常应用程序只是在一个默认的桌面上运行。图2.5 显示了这一层次结构。每个子系统会话都有自己的会话空间,属于某一会话的资源将从该会话空间中分配。当用户登录到Windows 中时,操作系统将为该用户建立一个会话;即使用户通过远程桌面或者终端服务连接到一个系统中,系统也会为该用户建立一个单独的会话。

     


     概括而言,设备驱动程序有以下三种基本类型:

    即插即用驱动程序(也称为WDM 驱动程序,见下文介绍)。这一类驱动程序通常是为了驱动硬件设备而由硬件厂商提供,它们与Windows 的I/O 管理器、即插即用管理器和电源管理器一起工作。Windows 自身随带了大量即插即用驱动程序,用于支持各种常见的存储设备、视频适配器、网络适配器、输入设备等。

    内核扩展驱动程序(也称为非即插即用驱动程序)。这一类驱动程序用于扩展内核的功能,或者提供访问内核模式代码和数据的一种途径。它们并没有集成到即插即用管理器和电源管理器的框架中。在引入即插即用管理机制以前开发的驱动程序都属于这一类型。现在仍然有大量的内核扩展驱动程序。

    文件系统驱动程序。这一类驱动程序接收针对文件的请求再进一步将请求转变成真正对于存储设备或网络设备的I/O 请求,从而满足原始的文件请求。

    Windows 的即插即用管理器是I/O 系统的一部分,它负责即插即用设备的内核支持,其职责是:自动检测设备的插入和移除;动态地分配硬件资源,例如中断、I/O 端口和I/O寄存器;指示I/O 管理器为设备加载正确的驱动程序;向内核及应用程序提供有关设备插入和移除的通知机制。即插即用管理器根据总线和设备的功能分工,定义了一个驱动程序模型,让总线和设备的驱动程序协作完成设备的列举、插入和拔除等管理工作。支持这一模型的驱动程序称为WDM(Windows Driver Model)驱动程序,共有三种类型:总线驱动程序功能驱动程序过滤驱动程序。总线驱动程序既负责管理总线上的设备(配合即插即用管理器),也为总线上的设备提供了访问总线资源的方法。功能驱动程序负责管理具体的设备,向操作系统提供该设备的功能。过滤驱动程序的用途是监视一个设备的I/O请求及其处理过程,甚至增加或改变一个设备或驱动程序的行为。

    在WDM 中,每个硬件设备都有一个设备驱动程序栈(简称设备栈),其中包含一个总线驱动程序和一个功能驱动程序,以及零个或多个过滤驱动程序。即插即用管理器在设备列举过程中,依照总线与设备之间的关系,构建起一棵设备树,其中包含当前系统中所有被检测到的总线和设备。设备树的每一个节点都代表一个实际的设备,该设备的设备栈为其提供软件服务,操作系统(实际上是I/O 管理器)通过设备栈来访问或操纵设备

    非即插即用驱动程序的用途多种多样,其中内核扩展是最自然的用法。例如,许多系统工具使用内核扩展类型的驱动程序来获得Windows 内核中的各种系统信息,或者创建系统线程以便在系统进程环境中执行任务。另外,在Windows 内核中,也有一些模块虽然以“.sys”作为文件扩展名,但它们其实并非设备驱动程序,而是单纯的内核扩展动态链接库,供其他的驱动程序或者内核模块调用。

    有关Windows 中I/O 管理器、即插即用管理器、电源管理器以及设备驱动程序的进一步介绍,可参考第6 章。

    文件系统/存储管理

    在现代操作系统中,文件系统是外部存储设备的标准接口,它为应用程序使用这些设备中的数据提供了统一的抽象,多个应用程序和系统本身可以共享使用这些设备。在Windows 中,文件系统的接口部分由I/O 管理器定义和实现,但文件系统的实现部分位于专门的一类驱动程序中。当文件系统接收到I/O 请求时,它会根据文件系统格式规范,将这些请求转变成更低层的对于外部存储设备的I/O 请求,通过它们的设备驱动程序来完成原始的I/O 请求。因此,文件系统的驱动程序定义了外部存储设备中数据的逻辑结构,使得这些数据可直接被操作系统和应用程序使用。

    Windows 的原生文件系统是NTFS(NT File System),其驱动程序为ntfs.sys。NTFS是专门为Windows 设计的文件系统格式,它提供了安全性、可靠性、大容量支持、长文件名支持,以及可恢复性等一系列高级特性,目前广泛应用于Windows 系统。另一个常用的文件系统格式是FAT(File Allocation Table),这是从DOS 时代发展起来的文件系统格式,格式规范相对比较简单,目前仍在使用,主要用于兼容老版本的操作系统,以及用于移动设备以便跨操作系统传送数据。

    在Windows 中,每个文件系统实例有它自己的设备栈,因而通过插入过滤驱动程序可以过滤文件I/O 请求。Windows 支持两种形式的过滤驱动程序:一种直接插入到设备栈中,从而能够看到每一个经过设备栈的文件I/O 请求;另一种基于Windows 提供的过滤管理器驱动程序(FltMgr)的I/O 过滤框架,称为文件系统小过滤驱动程序,它们并不出现在文件系统设备栈中,而是以回调方式来响应FltMgr 的事件。

    文件系统的底层是对存储设备的管理。大容量存储设备以“分区(partition)”和“卷(volume)”来管理整个存储空间。分区是指存储设备上连续的存储区域(连续的扇区),而卷是指扇区的逻辑集合。一个卷内部的扇区可能来自一个分区,也可能来自多个分区,甚至来自不同的磁盘。文件系统则是卷内部的逻辑结构。因此,Windows 的存储管理形成了一个存储栈,最接近于应用程序的是文件系统,接下来是卷管理部分,最接近于存储设备的是分区管理和磁盘驱动程序

    磁盘设备是典型的即插即用设备,其设备栈和驱动程序符合WDM 规范。即插即用管理器在设备列举过程中建立起每个磁盘设备的设备栈。设备栈的最底下是总线驱动程序,最上方是一个称为分区管理器的驱动程序,负责通知即插即用管理器当前磁盘上有哪些分区,因而系统中的卷管理器可以接收到有关分区创建和删除的通知。这样,每个物理分区与卷管理器联系起来,卷管理器再将卷与文件系统关联起来,就形成了完整的存储栈。

    有关Windows 中文件系统和存储管理的进一步介绍,可参考第7 章。

    网络

    网络虽然并非Windows 操作系统中必不可少的组成部分,但实际上,它已经成为绝大多数Windows 系统的标准配置。Windows 为应用程序提供了多种网络API,允许应用软件设计人员根据他们的需求适当选择。以下是Windows 平台上主要的网络API:

    Windows 套接字,简称Winsock。它实现并扩展了BSD 套接字标准。Winsock 2.0 版本支持一些新特性,比如异步网络I/O、服务质量(QoS)规范、可扩展名字空间,以及多点消息传输等。

    WinInet。这是一个高层网络API,它支持多个协议,包括Gopher、FTP 和HTTP。Microsoft Internet Explorer 使用WinInet 来完成数据传输。

    命名管道(named pipe)和邮件槽(mailslot)。用于不同进程之间进行通信。它们支持不同机器上的进程之间相互通信。命名管道支持连接方式的通信模型;邮件槽支持非连接方式的通信模型,客户进程可以发送广播消息。

    NetBIOS。这是一个早期的网络编程API,Windows 支持NetBIOS 是为了兼容老的应用程序。NetBIOS 支持有连接的通信和无连接的通信。

    RPC。这是网络编程的一个标准,往往是分布式系统基础设施的重要组件。RPC 建立在其他的网络API 基础之上,比如命名管道和Winsock。Windows 的RPC 支持异步调用方式。

    这些网络API 都提供了用户模式的动态链接库(DLL),当应用程序通过这些DLL发出网络I/O 请求时,它们必须将接收到的请求传递给内核模式下的相应驱动程序。通常,这些网络API 要么通过专门的系统服务切换到内核模式,比如命名管道和邮件槽就有专门的系统服务;要么通过标准的系统服务接口,比如NtReadFile、NtWriteFile 和NtDeviceIoControlFile,由I/O 管理器和对象管理器将网络请求转送至对应的驱动程序中。

    Winsock 是Windows 最重要的网络API,它的用户模式部分不仅包含了一个DLL(即ws2_32.dll),还定义了一个可扩展的框架,允许第三方插入传输服务提供者和名字空间服务提供者,以支持更多的传输服务和名称解析或地址映射能力。Winsock 默认支持TCP/IP、IPX/SPX、AppleTalk 和ATM 等协议,它提供的传输服务和名字空间服务都通过内核模式驱动程序afd.sys 实现网络通信。

    在内核模式部分,网络API 驱动程序(譬如afd.sys)通过传输驱动程序接口(TDI,Transport Driver Interface)与协议驱动程序进行通信。TDI 实际上是一组预定义的I/O 请求,它描述了各种网络请求,包括名称解析、建立连接、发送和接收数据等。网络API驱动程序是TDI 客户,而传输协议驱动程序实现了TDI 接口,称为TDI 传输器。TDI 客户与TDI 传输器之间是松耦合关系。一个TDI 传输协议驱动程序可以被多个TDI 客户使用。例如,TCP/IP 驱动程序为tcpip.sys,它既可以被Winsock 驱动程序afd.sys 使用,也可以被netbt.sys 驱动程序使用。Windows 不仅实现了基本的TCP/IP,还支持NAT(网络地址转译)、IP 过滤以及IPSec 规范等协议扩展,这些协议扩展也是内核驱动程序,它们通过私有的接口与tcpip.sys 进行通信。

    在Windows 中,网络协议与网络适配器驱动程序是分开的协议驱动程序独立于任何一个网络适配器,而真正发送和接收数据是通过网络适配器进行的。协议驱动程序通过统一的接口与适配器驱动程序进行通信,此接口是NDIS(Network Driver InterfaceSpecification)。符合NDIS 的网络适配器驱动程序称为NDIS 驱动程序,或NDIS 小端口驱动程序(NDIS miniport driver)。Windows 提供了NDIS 库,即ndis.sys,作为协议驱动程序与NDIS 驱动程序两者之间的桥梁。随Windows XP 和Windows Server 2003 一起发行的NDIS 库是NDIS 5.1;随Windows Vista 一起发行的NDIS 库是NDIS 6。

    NDIS 客户(即TDI 传输器)利用NDIS 库提供的功能,对将要发送给NDIS 驱动程序的命令进行格式化,并发送给NDIS 驱动程序;而NDIS 驱动程序则利用NDIS 库,接收请求和送回应答。NDIS 驱动程序并非标准的设备驱动程序,它们通过NDIS 库与NDIS客户进行通信,I/O 管理器并不介入两者之间的通信过程。

    有关Windows 网络体系结构的进一步介绍,可参考9.1 节。

     

    来源: <http://book.51cto.com/art/201011/235711.htm>

     

    2.2.3 Windows 子系统

    按照Windows NT 最初的设计,它支持三个环境子系统:OS/2、POSIX 和Windows(或称为Win32)。然而,Windows 子系统是必须要运行的,没有它Windows 系统无法运行,而其他两个子系统则被配置成按需启动。而且,到了Windows XP以后,只有Windows子系统随Windows 系统一起发行。这一节将介绍Windows 子系统的概况,更详细的信息,请参考9.2 节。

    在Windows 平台上,可执行映像文件的格式为PE 文件格式[PE-SPEC](参见上一小节中插入的关于PE 文件格式的介绍),其头部域Subsystem 指定了该应用程序将被运行在哪个环境子系统中。Microsoft Visual Studio 的链接器(linker)支持/SUBSYSTEM 命令选项,由它来指定子系统的类型。例如,该域为2 说明这是一个Windows GUI 应用程序,为3则是Windows 控制台应用程序(Windows CUI)。

    Windows 子系统中既有用户模式部分,也有内核模式部分。内核模式部分的核心是win32k.sys,虽然它的形式是一个驱动程序,但实际上它并不处理I/O 请求,相反,它向用户代码提供了大量的系统服务。从功能上讲,它包含两部分:窗口管理和图形设备接口(GDI)。其中窗口管理部分负责收集和分发消息,以及控制窗口显示和管理屏幕输出;图形设备接口部分包含各种形状绘制以及文本输出功能

    用户模式部分包括Windows 子系统进程(csrss.exe)以及一组动态链接库(DLL)。Csrss.exe 进程主要负责控制台窗口的功能,以及创建或删除进程和线程等。子系统DLL则被直接链接到应用程序进程中,包括kernel32.dll、user32.dll、gdi32.dll 和advapi.dll 等,负责实现已文档化的Windows API 函数。除了有些可以直接在用户模式中完成以外,很多API 函数需要调用执行体API 或win32k.sys 模块提供的系统服务

    Win32k.sys 一方面向用户代码提供系统服务,另一方面也跟Windows 内核紧密地融合在一起。它通过向内核注册一组出调(callout)函数,以便介入到内核的线程和进程管理等处理逻辑中,同时也可以接收电源事件。对于每个线程,一旦它调用了win32k.sys的任何一个系统服务,就变成了一个GUI 线程,从而纳入到了Windows 子系统的线程和进程管理范畴。Windows 内核的线程和进程数据结构为Windows 子系统预留了一些域,从而win32k.sys 可以方便地操纵它的线程和进程。

    下面从窗口管理和图形设备接口两方面来介绍Windows 子系统的核心功能和结构。

    窗口管理

    Windows 子系统的用户界面管理有一个层次结构,通常应用程序只是在一个默认的桌面上运行。图2.5 显示了这一层次结构。每个子系统会话都有自己的会话空间,属于某一会话的资源将从该会话空间中分配。当用户登录到Windows 中时,操作系统将为该用户建立一个会话;即使用户通过远程桌面或者终端服务连接到一个系统中,系统也会为该用户建立一个单独的会话。

     

    在一个会话中,有一个交互式窗口站,可能还有非交互式窗口站。在交互式窗口站中通常有三个桌面:登录桌面、默认桌面和屏幕保护桌面。通常我们运行的图形界面应用程序运行在默认桌面上。交互式窗口站有独立的剪贴板、键盘、鼠标、显示器等,在它的三个桌面中,任一时刻只有一个是激活的,输入输出设备归激活的桌面所有

    在每个桌面中,都有一个顶级窗口列表,这些窗口往往可以相互重叠,有系统菜单、最大化/最小化按钮和滚动条等。通常各个图形界面应用程序的主窗口属于当前桌面的顶级窗口。在Windows 中,窗口可以有子窗口,子窗口占据父窗口的客户区域。因此,桌面上的窗口形成了一个层次结构。图2.5 仅仅显示了顶级窗口的子窗口,实际上,一个窗口总是可以构建它自己的子窗口。

    Windows 为常用的窗口定义了一些窗口类(window class),因而应用程序可以非常方便地创建这些窗口类的实例。应用程序如果要定义独特的窗口特性,可以生成一个窗口类,这个窗口类既可以是全新的,也可以是在系统已有窗口类的基础上定义得到。窗口类规定了其对象将如何响应各种消息,包括系统发送给它的消息和用户触发的消息。Windows 窗口的编程模型是消息驱动的,每个窗口对象根据其窗口类指定的窗口过程来响应各种消息。

    Windows 子系统会话有一个RIT(Raw Input Thread)线程,负责从输入设备读取原始的输入事件,然后生成消息寄送到正确的线程消息队列中。每个包含用户界面元素的线程都应该及时地处理这些消息。通常的做法是在一个消息循环中,不停地获取消息,再分发给目标窗口,由目标窗口的窗口过程来响应。有关Windows 子系统中的窗口管理和消息机制的更多信息,请参考9.2.3 节。

    图形设备接口

    Windows 的图形引擎也是在Windows 子系统中提供的,它有两方面的特点:首先,它提供了一套与设备无关的编程接口,即GDI,这使得应用程序可以适应各种底层显示设备的差异;其次,应用程序与图形设备驱动程序之间的通信足够高效,从而即使在频繁输出和刷新图形元素的情况下,Windows 也能够为用户提供良好的视觉效果。

    在技术上,Windows 子系统定义了一个稳定的图形体系结构,以便于第三方的图形设备硬件厂商可以方便地将他们的视频显示器和打印设备集成到Windows中。如图2.6 所示,win32k.sys 通过DDI(显示设备驱动程序接口)与显示驱动程序打交道,而显示驱动程序通过ENG(图形引擎接口)调用win32k.sys 中图形引擎的功能

     

    图2.6 Windows 子系统的图形模块结构

    Win32k.sys 的图形引擎实现了基于标准格式位图的图形绘制功能。显示驱动程序在初始化时向图形引擎报告它所支持的物理设备的特征描述。显示驱动程序既可以自己管理图形表面(surface),也可以直接使用图形引擎管理的图形表面。另外,显示驱动程序可以有选择地截取GDI 的图形绘制操作,也可以将图形绘制操作转交给图形引擎。因此,显示驱动程序在实现功能方面有很大的灵活性。

    如图2.6 所示,显示驱动程序可以帮助图形引擎实现针对特定视频适配器的图形功能,视频小端口驱动程序更是针对视频适配器的硬件特性。两者的分工原则是:显示驱动程序执行一些对用户可见并且性能紧急的图形操作,譬如,它可以直接访问适配器的视频存储区或者寄存器;而视频小端口驱动程序执行一些不常见的图形操作,或者一些不能被中断打断或其他进程抢占的关键图形操作

    视频端口驱动程序由Windows 操作系统提供,它实际上是一个动态链接库,用于帮助视频小端口驱动程序实现一些公共的、与图形处理有关的功能,以及为小端口驱动程序提供一个与系统内核和执行体打交道的环境。视频小端口驱动程序则负责直接的硬件资源管理和控制

    Windows 子系统的图形系统,除了支持GDI,还提供了对DirectX 的显示支持,包括DirectDraw 和Direct3D,因而允许像游戏、多媒体播放器等应用软件绕过GDI 图形引擎,直接操纵显示器硬件,从而获得更快的显示速度,并且避免屏幕抖动

    有关Windows 子系统图形功能部分的详细信息,请参考9.2.4 节关于Windows 显示驱动程序模型的描述,以及9.2.5 节关于Windows Vista 以后变化情况的简单介绍。

     

    来源: <http://book.51cto.com/art/201011/235712.htm>

     2.2.4 系统线程和系统进程

    在Windows 中,每个线程代表一个令执行序列,同时也是一个调度单元;进程定义了一个执行环境,有自己独立的地址空间。每个线程都必定依附于一个进程。Windows内核除了接受来自应用程序的系统服务调用,它己也有一些线程用于各种用途。这些线程运行在一个特殊的进程环境中,称为System 进程。为区分该进程与本节下文即将介绍的操作系统关键进程,本书将前者称为System 进程,而将后者称为系统进程。System 进程的线程被称为系统线程,其中有一组系统辅助线程(system worker thread),它们代表操作系统或者其他的应用进程来完成一些特殊的工作。

    设备驱动程序或执行体既可以在调用者进程中创建线程,也可以在System 进程中创建线程。或者,也可以不创建任何一个线程,而是调用执行体函数ExQueueWorkItem 或I/O 管理器函数IoQueueWorkItem,向系统辅助线程请求得到它们的服务。这两个函数负责把一个工作项目(WorkItem)放到一个队列中,而系统辅助线程将从此队列提取工作项目,并执行工作项目中指定的一个例程。因此,工作项目中的例程是在System 进程的环境中执行的,它不能访问其他进程空间中的数据。

    系统辅助线程实际上是一个线程池,Windows 在系统初始化时创建了一定数量的辅助线程,而且,随着辅助线程的负载的变化,执行体也会动态地创建一些辅助线程,以满足系统负载的变化需求。

    除了系统辅助线程,内核中的许多组件也会创建系统线程来完成一些必要的工作,例如,内存管理器需要后台系统线程来监视和管理页面的换入和换出。另外,设备驱动程序也可以通过调用PsCreateSystemThread 函数来创建系统线程,以便完成一些并非依附于调用者进程空间的任务,例如网络驱动程序和文件系统驱动程序可以利用系统线程来完成一些必要的后台处理。注意,通过PsCreateSystemThread 函数来创建系统线程时也可以指定其他的进程作为系统线程的宿主进程,从而能够访问该进程地址空间中的数据,但默认的宿主进程是System 进程。在本书后面章节的讲述中,我们会提到一些特定任务的系统线程,甚至可以了解到它们在什么情况下是如何被创建的。

    从进程的角度来看,Windows 有一组系统进程对于整个系统的运行来说是必不可少的,包括本章前面介绍过的子系统进程csrss.exe。当Windows 操作系统引导起来,并且用户登录到系统中时,Windows 已经经过了一系列初始化过程,除了负责与用户交互的Shell 进程,还启动了诸多系统进程用于实现各种不同的系统任务。总体而言,以下这些系统进程在Windows 操作系统中扮演了重要的角色:

    系统空闲进程(Idle)。该进程的ID 为0,其中每个处理器或核对应有一个线程。

    System 进程。在Windows XP 和Windows Server 2003 中该进程的ID 为4,它包含了内核模式系统线程。正如本节上文所述,系统辅助线程,以及执行体和驱动程序通过PsCreateSystemThread 创建的线程,都在System 进程中。

    会话管理器(Session manager,smss.exe)。这是Windows 系统中第一个创建的用户模式进程。Smss 在Windows 启动过程中承担了一些重要的步骤,例如创建环境变量等,尤为重要的是,它启动了子系统进程csrss.exe 和登录进程winlogon.exe。另外,会话管理器也负责创建新的终端服务器会话(terminal server session),包括建立会话空间的数据结构,然后为新建的终端服务器会话加载子系统,启动csrss.exe 和winlogon.exe。

    登录进程(winlogon.exe)。它负责处理交互用户的登录和注销。当用户按下Ctrl+Alt+Del 组合键(称为安全注意序列[SAS,Secure Attention Sequence])时,winlogon 就会接到登录请求,然后激发安全认证过程,并启动用户会话中的初始进程。在用户会话的任何时候,当用户按下了SAS 组合键时,winlogon 都会提示一个安全对话框,其中通常包含“注销”、“启动任务管理器”、“锁定计算机”、“更改密码”、“关机”等选项。

    Windows 子系统进程(csrss.exe)。正如本章前文所提到的,Windows 子系统进程负责为用户提供一个子系统环境,包括提供控制台窗口的功能,以及创建或删除进程和线程。

    本地安全权威子系统进程(lsass.exe)。它负责本地系统安全策略,例如允许哪些用户登录到本地系统中、口令策略、授予用户和用户组的特权,以及系统安全审计设置;同时也负责认证用户的身份,以及将安全审计消息发送到系统的事件日志(EventLog)中。

    Shell 进程(explorer.exe)。这是Windows 的默认Shell,它提供了系统与用户打交道的各种界面,包括开始菜单、任务栏、资源管理器窗口等几乎所有Windows 用户都熟悉的界面。

    服务控制管理器(services.exe)。它负责管理Windows 的系统服务,这里的系统服务是指一些特殊的进程,它们通常并不与登录用户进行交互,因而被配置成可以在系统引导时自动启动起来,无须交互登录过程。Windows 中有很多功能组件是以服务的方式来实现的,比如事件日志、任务调度器和各种网络组件等。

     

    来源: <http://book.51cto.com/art/201011/235713.htm>

     

     


    展开全文
  • Windows内核情景分析-概述

    千次阅读 2018-08-06 22:47:18
    现在的windows内核包含了两大部分,一部分是本来意面上的操作系统内核,另一部分则是移到了内核中的视窗服务,前者对应ntoskrnl.exe后者win32k.sys;后者部分为了保证效率。windows操作系统包含多个子系统,最常用...
  • windows内核开发笔记二:错误信息处理 GetLastError: GetLastError返回错误编码,即便出错函数后边跟随一个正确执行了的函数,也不会覆盖原先的错误代码: GetLastError返回的值通过在api函数中调用SetLastError...
  • Windows内核调试器 - 简介

    千次阅读 2016-03-24 20:27:12
    Windows内核调试器 - 原理 WinDbg    WinDBG和用户调试器一点很大不同是内核调试器在一台机器上启动,通过串口调试另一个相联系的以Debug方式启动的系统,这个系统可以是虚拟机上的系统,也可以是另一台...
  • Windows内核调试器原理浅析

    千次阅读 2007-05-01 15:07:00
    Windows内核调试器原理浅析创建时间:2004-12-23文章属性:原创文章提交:SoBeIt (kinsephi_at_hotmail.com)Windows内核调试器原理浅析 SoBeIt 前段时间忽然对内核调
  • windows内核情景分析--内存管理

    千次阅读 2014-04-04 09:53:54
    每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同 虚拟地址如0x11111111, 看似这8个数字是一...
  • 应用软件在用户空间可以访问的最低地址是MM_LOWEST_USER_ADDRESS,定义为0x...这个区间是在系统空间,却又划出来让用户空间的程序访问,目的是用来让用户空间的程序访问内核中的一些数据。而且,这个区间是由系统空间
  • windows内核情景分析---进程线程

    千次阅读 2014-04-04 10:12:51
    所以,那个内核页面称之为内核空间提供给各个进程的一块共享之地。(事实上,这个公共页面非常有用,可以在这个页面中放置代码,应用程序直接在r3层运行这些代码,如在内核中进行IAT hook) 如上: 【用户空间的...
  • 1、Windows采用双模式来保护操作系统本身,R0和R3。在
  • 用户态与内核共享内存例程

    千次阅读 2013-04-20 18:57:09
    例子中,用户态程序的KERNEL_VIRT_ADDR就是内核模块打印的地址p ,这里是hard coding(先加载内核模块,再把打印的地址赋值给KERNEL_VIRT_ADDR), 可以采用其他的方式传递。 2.6内核验证。 //kernel ...
  • windows内核状态下进程创建解析

    千次阅读 2014-01-01 23:55:06
    存与进程管理器 ========================== But I fear tomorrow I'll be crying, Yes I fear tomorrow I'...关于Windows NT内存管理器的高层次信息已经够多的了,所以这里不会再讲什么FLAT模型、 虚拟内存之类
  • 读书笔记_windows内核编程基础_part 2

    千次阅读 2011-10-18 22:30:40
    内核程序可以被看做是一个PE格式的DLL,它是被Windows整个内核调用的一个DLL(一种比喻,并非是真的DLL),它是被Windows整个内核调用,一旦加载,就会成为内核的组成部分,并非特定处于某个进程中。所有的内核空间...
  • Windows/Linux内核地址空间管理的异同

    千次阅读 2013-11-16 13:12:59
    相信很多人都知道Windows页表自映射一说,也晓得Linux内核的一一线性映射。然而很多人也仅仅就是知道而已,记住一个结论比理解一个原因要简单得多。 上周末,有人极具挑衅态度的问我能否分别用一句话描述它们,我...
  •  例如,如果向pagefile换出页,保留这些位可以说明其在页面文件中的位置和page file号。 U/S - 是否能从user模式访问页。正是借助于此位提供了对内核空间的保护(通常为高2G )。 RW - 是否能写入 NT使用的为...
  • windows XP系统内核文件分析精简系统很有好处黑客防线 当然, 精简系统是要付出代价的. 不要贪得无厌, 免得系统坏了修不好啊. Windows XP个别 System32 文件 System32 文件夹下个别要移除的文件 我们就要删除另外600...
  • Windows 驱动程序的发展演变 我们在学习开发驱动程序时有必要弄清楚Windows设备驱动程序的发展演变过程(为了简便起见,以下简称驱动程序),以便明白我们将要开发什么样的驱动程序。这就象你开发一个应用程序时必须...
  • windows XP系统内核文件分析

    千次阅读 2007-01-15 22:47:00
    Windows XP个别 System32 文件 System32 文件夹下个别要移除的文件 我们就要删除另外600 个 system32 文件...我们要一次把它们全都解决掉. 以下是我所删除的 System32 文件列表, 另外还有相关的批处理...
  • 深入了解 Windows Server 2008 内核变化

    千次阅读 2008-04-07 13:42:00
    概览: ●内存管理和 SMB 2.0 ●NTFS 自修复功能、Windows 硬件错误报告体系和驱动程序验证程序 ●I/O 完成端口、线程池和 NUMA 的可伸缩性 ●Hyper-V 虚拟化 Windows Server 2008 是最新版本的 Microsoft ...
  • Windows 驱动程序的发展演变 我们在学习开发驱动程序时有必要弄清楚Windows设备驱动程序的发展演变过程(为了简便起见,以下简称驱动程序),以便明白我们将要开发什么样的驱动程序。这就象你开发一个应用程序时必须...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,399
精华内容 10,959
关键字:

windows内核页面共享