Windows基本架构

Windows架构

Windows基本架构:主要分为R0-R3四个层级,其中R0(内核态)包括内存、进程、线程、I/O等管理,核心体,设备驱动程序,硬件抽象层(HAL);R3(用户态)包括NTDLL.DLL主要由服务进程、Win32应用程序以及win32子系统动态链接库构成。
用户模式进程有如下四种基本的模型:

  • 固定的系统支持进程,比如登录进程和会话管理器,它们并不是Windows服务;
  • 服务进程宿纳的是Windows服务,比如Task Sechedular和Print Spooer服务。Windows服务往往要求独立于用户登录而运行;
  • 用户应用程序;
  • 环境子系统服务器进程实现了操作系统环境的支持部分。这里所谓的环境是指操作系统展示或给用户或程序员的个性化服务;将基本的Windows执行系统服务的某个子集暴露给应用程序。
  • 其中应用程序和环境子系统通过一个或多个子系统动态链接库发起调用。将一个已文档化的函数转化为一些恰当的内部原生系统服务调用。

Windows子系统组件构成:

  • 对于每个会话,环境子系统进程(csrss.exe)有一个实例加载三个DLL(Basesrv.dll、Winsrv.dll和csrsrv.dll),它们包含下列支持:

    • 创建或删除进程和线程;
    • 对16位DOS虚拟机(VDM)进程的部分支持;
    • SxS/Fusion和清单文件支持;
    • 其他函数,如GetTemplateFile
  • 内核模式设备驱动程序(Win32k.sys)包含下列支持:

    • 窗口管理器,它控制窗口显示,管理屏幕输出,采集来自键盘、鼠标和其他设备的支持,同时也负责将用户消息传递给应用程序;
    • 图形设备接口,它是专门针对图形输出设备的函数库,其中包括线段、文本和图形的绘制函数,以及图形控制函数。
    • DirectX功能的包装函数,Windows对DirectX的支持是在另一个内核驱动程序(Dxgkrnl.sys)中实现的。
  • 控制台宿主进程(Conhost.exe),提供了对控制台应用程序的支持。

  • 子系统DLL(Kernel32.dll、Advapi.dll、User32.dll和Gdi.dll)将已经文档化的Windows API函数,转译成Ntoskrnl.exe和Win32k.sys中恰当的且绝大部分未文档化的内核模式系统服务调用;

  • 图形设备驱动程序,与硬件相关的图形显示器驱动程序、打印机驱动程序和视频微端口驱动程序
    某应用程序调用某个子系统DLL的某个函数时,可能发生下述三件事情之一:

  • 该函数完全是在该子系统DLL中实现的,在用户模式下运行。即该函数并没有给环境子系统进程发送消息,也没有调用Windows执行体系服务,如GetCurrentProcess;

  • 该函数要求调用执行体一次或者多次,如ReadFile函数;

  • 该函数要求在环境子系统进程中完成某些工作。

子系统是由会话管理器(smss.exe)进程启动的

windows内核模式组件包含:

  • Windows执行体包含了基本的操作系统服务,比如内存管理、进程和线程管理、安全性,I/O、网络和跨进程通信;

  • Windows内核是由一组低层次的操作系统功能构成的,比如线程调度、中断和异常分发,多处理器同步。提供了一组例程和基本对象,执行体的其余部分利用这些例程和对象实现更高层次的功能;

  • 设备驱动程序既包括硬件设备驱动程序,也包括像文件系统和网络驱动程序之类的非硬件设备驱动程序。其中硬件设备驱动程序将用户的I/O函数调用转换成特定的硬件设备I/O请求。

  • 硬件抽象层是指一层特殊的的代码,它把内核、设备驱动程序和Windows执行体的其余部分,跟与平台相关的硬件差异隔离起来。

  • 窗口和图形系统实现了图形用户界面功能
    进程:相当于一个容器,包含了执行程序的特定实例时所用到的各种资源。从抽象的程度来看,进程由以下部分组成.

  • 私有的虚拟地址空间。可执行的程序,它定义了初始的代码;

  • 可执行的程序,它定义了初始的代码和数据,并且被映射到该进程的虚拟地址空间中;

  • 已打开句柄的列表,这些句柄指向各种系统资源,该进程内所有的线程都可以访问这些系统资源;

  • 被称为访问令牌的安全环境,它标识了与该进程关联的用户、安全组、特权、uac虚拟化状态、会话,以及有限的用户账户状态;

  • 被称为进程ID的唯一标识;

  • 至少执行一个线程。

线程使进程内的一个实体,也是Windows执行进程时的调度实体。线程包括以下一些部件:

  • 一组代表处理器状态的CPU寄存器中的内容;
  • 两个栈-一个用于线程在内核模式下执行时,另一个用于线程在用户模式下执行时;
  • 一个被称为线程局部存储(tls)的私有存储区域,各个子系统、运行库和DLL都会用到该存储区域;
  • 一个被称为线程ID的唯一标识符;
    -有时候线程也有它们自己的安全环境或者令牌,多线程服务器应用程序要模仿其客户的安全环境时,常常会使用线程自己的安全环境。

易失的寄存器、栈和私有存储区域合起来被称为线程的环境(Context)。

CPU从一个线程切换到另一个线程不可避免涉及内核调度器,这是一个昂贵的操作,如果两个线程频繁地切换可以采用:纤程(fiber)或者用户模式调度。为了使用纤程需要先调用这个函数

ConvertThreadToFiber

与线程不同的是,纤程不会主动执行需要调用这个函数之后才能执行:

SwitchToFiber

通常情况下,一个进程中的线程不可能无意地引用另一个进程的地址空间,除非两种情况:

  • 第二个进程将它的一部分私有地址空间变成共享内存区,在Windows中称为文件映像对象;
  • 第一个进程有权打开第二个进程,从而可以使用诸如ReadProcessMemeory和WriteProcessMemory等跨进程的的函数。

作业使一组进程被当作一个整体来管理和维护。通过作业对象,可以对特定的属性进行控制,可以对一个进程或者所有与作业有关的进程进行限制。

在Windows 64位中,内核模式代码签名策略规定,64位设备驱动程序必须要经过某个权威结构发放的密钥来签名。用户不能明确地强制安装未经签名的驱动程序,即使管理员用户也不行,但是可以在系统引导时手工禁止,在引导时按下F8键,选择高级引导选项“禁用驱动程序强制签名”

Ntdll.dll是一个特殊的系统支持库,主要用于子系统DLL。包含两种函数:

  • 系统服务分发存根(stub),它们会调用Windows执行体的系统服务。
  • 内部支持函数,供子系统DLL以及其他的原生映像文件使用。

执行体是Ntoskrnl.exe的上层。执行体包含以下类型函数:

-可在用户模式下调用的导出函数。

系统机制

陷进分发包括中断、延时的过程调用(DPC)、异步过程调用(APC)、异常分发、系统服务分发。
软件中断:激发线程分发、并非时间紧急的中断处理、处理定时器到期、在特定线程的环境中异步地执行一个过程、支持I/O异步操作。
对象管理器:执行体内部负责创建、删除、保护和跟踪对象的组件。

你可能感兴趣的:(操作系统,wondows,基本架构)