当前位置: 首页 > news >正文

湛江网站建设费用做网站和做app哪个更难

湛江网站建设费用,做网站和做app哪个更难,上海今天最新的新闻,iis7发布php网站文章目录 前言Windosw内核 理论基础Windows体系结构CPU权限级别内存空间布局Windows内核结构硬件抽象层#xff08;HAL#xff09;内核层执行体层设备驱动程序文件系统/存储管理网络 Windows子系统窗口管理图形设备接口 系统线程和系统进程 内核基本概念处理器模式内存管理进… 文章目录 前言Windosw内核 理论基础Windows体系结构CPU权限级别内存空间布局Windows内核结构硬件抽象层HAL内核层执行体层设备驱动程序文件系统/存储管理网络 Windows子系统窗口管理图形设备接口 系统线程和系统进程 内核基本概念处理器模式内存管理进程和线程管理中断和异常同步 内核重要数据结构内核对象SSDTPEBTEB注册表 前言 近俩天的学习-Windows内核基础的学习笔记。算是一个概述毕竟每一个小点单拉出来都可以讲好久。学了这俩天对内核的理解算是清晰了那么一点点了持续学习ing…欢迎师傅一起交流讨论私信andwx都欢迎。感谢。 参考文献 《加密与解密》Windows内核基础 《Windows内核原理与实现》系统总述 《深入理解Windows操作系统》 Chat Gpt… MSDN文档。 一些零零散散的大佬的blog。感谢。 Windosw内核 理论基础 Windows体系结构 CPU权限级别 系统内核层又称零环Ring0简称R0与此对应的是3环R3应用层实际上是CPU的4个级别CPU在设计时将CPU的运行级别从内到外分为4个层级R0-R3R0权限最高依次降低实际上现在只区分R0和R3并没有使用R1和R2。 分级的目的是为了保护系统的稳定性和安全性。通过限制某些操作只能在高权限级别下执行操作系统可以防止用户级应用程序意外或恶意地修改关键系统资源进而导致系统崩溃或安全漏洞。 Windows 体系结构简图 从上图可以看到Windows使用双模式来保护操作系统本身用户模式对应的就是R3内核模式即R0。在这种架构下应用程序的代码只能运行在用户模式下每当它需要使用到系统内核或内核的扩展模块内核驱动程序所提供的服务时应用程序通过硬件指令从用户模式切换到内核模式中当系统内核完成了所请求的服务以后控制权又回到用户模式代码。 内存空间布局 Windows中用户代码和内核代码有各自的运行环境并且它们可以访问的内存空间也不同。 以x64为例在4G的虚拟内存空间中WIndows系统的内存分为内核空间和应用空间每部分各占2GB。 其中用户空间占用低地址00000000 ~ 7FFFEFFF内核空间占用高地址(7FFF000 ~ FFFFFFFF)若是开启了大地址空间模式的程序LARGE_ADDRESS_AWARE则内存空间布局会变成3GB 的用户空间和 1GB 的内核空间。 Windows内核结构 如图Windows内核中主要可以分成三层硬件抽象层HAL内核层也称微内核micro-kernel执行体层。 内核层实现操作系统的基本机制而所有的策略决定则留给执行体。执行体中的对象绝大多数封装了一个或者多个内核对象并且通过某种方式比如对象句柄暴露给应用程序。 Windows内核为用户模式提供了一组系统服务供应用程序使用内核中的功能。应用程序通常并不直接调用这些系统服务而是通过一组系统DLL最终通过ntdll.dll切换到内核模式下的执行体API函数中以调用内核中的系统服务。 Ntdll.dll是链接用户模式代码和内核模式系统服务的桥梁。对于内核提供的每一个系统服务该DLL都提供一个相应的存根函数这些存根函数的名称以“Nt”作为前缀例如NtCreateProcess、NtOpenFile等。另外ntdll.dll还提供了许多系统级的支持函数比如映像加载器函数以“Ldr”为前缀、系统时间函数以“Etw”为前缀以及一般的运行支持函数以“Rtl”为前缀和字符串支持函数等。 执行体API函数接收的参数来自于各种应用程序因此为了保证系统的安全以及抵抗来自用户模式的恶意攻击所有的执行体API都必须保证参数的有效性。通常执行体系统服务函数会在其开始处对所接收的参数逐一探查它们的可访问性。例如如下代码 PreviousMode KeGetPreviousMode(); if (PreviousMode ! kernelMode){try{ProbeForWrite(InputInformation,InputInformationLength,sizeof(ULONG));if (ARGUMENT_PRESENT(ReturnLength)){ProbeForWriteUlong(ReturnLength);} except(EXCEPTION_EXECUTE_HANDLER){return GetExceptionCode();}} }解析 调用 KeGetPreviousMode 函数来获取当前的执行模式内核模式or用户模式用 if判断是否是内核模式kernelMode使用了一个try{...}except(){...} 异常处理try中包含一些堆内存的探测Probe操作ProbeForWirte是一个检查内存可写性的函数用于检查InputInformation指向的内存区域是否可以安全写入数据第二三个参数分别是数据的长度和数据的大小。接着检查是否传递了 ReturnLength参数如果传递了就进一步检查内存可写性except 如果触发了异常用GetExceptionCode获取错误码 Windows内核中的关键组件 硬件抽象层HAL 硬件抽象层Hardware Abstraction LayerHAL这一层把所有与硬件相关联的代码逻辑隔离到一个专门的模块中为操作系统的上层提供一个抽象的、一致的硬件资源模型。这使得上层的模块无须考虑硬件的差异它们通过HAL而不是直接访问硬件。 在Windows中HAL是一个独立的动态链接库。HAL提供了一些例程供其他内核模块或设备驱动程序调用这使得一个驱动程序可以支持同样的设备在各种硬件平台上运行。HAL不仅涵盖了处理器的体系结构也涉及了中断控制器、单处理器或多处理器等硬件条件。 内核层 这是大内核中的小内核也称微内核。它是内核模块ntoskrnl.exe的下层部分(上层为执行体),最接近HAL层,负责线程调度和中断、异常的处理。对于多处理器系统它还负责同步处理器之间的行为以优化系统的性能。 Windows的内核实现了抢占式线程调度机制按照优先级顺序将线程分配到处理器上并且允许高优先级的线程中断或抢占低优先级的线程。每个线程有一个基本优先级值base priority和一个动态优先级值。根据这俩个值内核根据调度规则来切换线程让系统更快响应用户的动作以及在系统服务和其他低优先级进程之间平衡处理器资源的分配。 Windows内核按照面向对象的思想来设计它管理俩种类型的对象分发器对象和控制对象。分发器对象实现了各种同步功能这些对象的状态会影响线程的调度。Windows内核实现的分发器对象包括事件event、突变体mutant、信号量semaphore、进程process、线程thread、队列queue、门gate和定时器timer。控制对象被用于控制内核的操作但是不影响线程的调度它包括异步过程调用APC、延迟过程调用DPC以及中断对象等。 执行体层 执行体是内核模块ntoskrnl.exe的上层部分它包含5种类型的函数 系统服务调度函数System Service Dispatch Functions这些函数主要负责响应系统服务请求。当用户模式应用程序请求操作系统服务时这些函数会被调用。例如NtCreateFile、NtReadFile等函数。内核模式支持函数Kernel Mode Support Functions这类函数提供给其他内核模式组件使用以执行各种底层任务如内存管理、进程和线程管理等。例如ExAlloctePool分配内核池内存、KeSetEvent设置一个事件对象的状。执行对象管理函数Executive Object Management Functions这些函数用于管理Windows中的各种执行对象如进程、线程、事件、信号量等。例如 ObOpenObjectByPointer :根据对象指针打开对象、 ExCreateCallback创建一个回调对象。安全引用监视器函数Security Reference Monitor Functions这些函数用于实现操作系统的安全机制包括访问控制、权限检查等。例如 SeAccessCheck检查访问权限。I/O系统支持函数I/O System Support Functions这些函数支持输入/输出系统的操作包括文件系统的管理、设备驱动程序的交互等。例如 IoWriteErrorLogEntry写入错误日志条目。 关于函数前缀这些函数都以固定的前缀开始分别属于内核中不同的管理模块 与应用层函数不同在windows操作系统中调用内核函数必须要关注中断请求级别IRQLInterrupt Request Level。 IRQL 是一个表示中断优先级的数字用于确保处理器在处理不同的任务时维持正确的操作顺序和安全性。操作系统内核使用不同的 IRQL 来管理对硬件资源的访问以及处理不同级别的中断和异常。 在调用内核函数时必须要确保当前的IRQL与被调用函数所要求的级别相符。不遵守这一规则可能导致系统崩溃或数据损坏。IRQL的级别如下 被动级别PASSIVE_LEVEL这是最低的IRQL级别。在此级别线程可以被抢占可以执行任何类型的内核模式代码包括页面操作。APC级别APC_LEVEL此级别用于阻止异步过程调用APC的执行。调度级别DISPATCH_LEVEL在此级别可以阻止线程调度但仍允许处理硬件中断。很多非分页内存操作需要在此级别或更低级别执行。DIRQL设备IRQL这是特定于设备的中断级别。不同的设备驱动程序可能会使用不同的DIRQL。高IRQLHIGH_LEVEL这是最高的IRQL级别用于系统关键操作此时几乎所有的中断都被禁止。 开发内核模式驱动程序时合理地管理IRQL至关重要。如果一个函数要求在低IRQL下运行而当前IRQL较高就不能直接调用那个函数反之亦然。不正确的IRQL处理可能导致系统不稳定或蓝屏BSOD。 执行体中除了函数组成还包含了如图中的多个重要的组件以下 内存管理器实现了虚拟内存管理既负责系统地址空间的内存管理又为每个进程提供了一个私有的地址空间支持进程之间的内存共享。内存管理器也为缓存管理器提供了底层支持。缓存管理器它为文件系统提供了统一的数据缓存支持允许文件系统驱动程序将磁盘上的数据映射到内存中并通过内存管理器来协调物理内存的分配。文件系统管理文件和目录的创建、读写和组织。进程和线程管理器负责进程线程的创建和终止。在Windows中对于进程和线程的底层支持是在内核层提供的执行体只是在其基础上提供了一些语义和功能。即插即用管理器负责列举设备加载并初始化设备所需的驱动程序。还负责检测系统中的设备变化。安全引用监视器SRM该组件强制在本地计算机上实施安全策略它守护着操作系统的资源执行对象的保护和审计。配置管理器管理系统注册表提供系统配置和启动信息。I/O管理器实现了与设备无关的输入和输出功能负责将I/O请求分发给正确的设备驱动程序以便进一步处理。对象管理器它负责创建、管理、删除Windows执行体对象以及用于表达操作系统资源的抽象数据类型比如进程、线程和各种同步对象。局域网管理器本地过程调用LPC负责处理进程之间的通信管理消息传递和远程过程调用。 设备驱动程序 在内核中除了内核模块ntoskrnl.exe和HAL以外其他模块几乎都以设备驱动程序的形式存在。 Windows中的设备驱动程序并不一定对应物理设备它既可以创建虚拟设备也可以与设备无关它仅仅是内核的扩展模块。从软件结构角度而言可以认为设备驱动程序是Windows内核的一种扩展机制系统通过设备驱动程序来支持新的物理设备或者扩展功能。 设备驱动程序是可以加载到系统中的模块其文件扩展名为**.sys**其格式是标准的 PE文件格式。驱动程序中的代码运行在内核下尽管它们可以直接操纵硬件但理想的情况是调用HAL中的函数与硬件打交道因此驱动程序往往用C/C语言来编写从而可以方便地在Windows所支持的体系结构之间进行源代码层次上的移植。 根据设备驱动程序的功能和行为可以将设备驱动程序分为三类 即插即用驱动程序支持即插即用技术的驱动程序。它们可以在设备连接到计算机时自动被识别和配置无需用户手动干预。非即插即用驱动程序不支持即插即用技术的驱动程序。可能在安装时需要用户手动配置。文件系统驱动程序专门用于处理文件操作的驱动程序如管理文件的存取、文件系统的结构等。 即插即用驱动程序也可以称为WDMWindows Driver Model驱动程序。WDM是一种设备驱动模型它提供了一个统一的框架使驱动程序可以在不同版本的WIndwos操作系统上运行。 WDM通常分为三个层次 总线驱动程序负责管理总线上的设备也为总线上的设备提供了访问总线资源的方法。功能驱动程序负责管理具体的设备向操作系统提供该设备的功能。筛选/过滤驱动程序监视一个设备的I/O请求以及其处理过程增加或改变一个设备或驱动程序的行为。 在WDM中每个硬件设备都有一个设备驱动程序栈简称设备栈其中包含一个总线驱动程序和一个功能驱动程序以及零个或多个过滤驱动程序。 文件系统/存储管理 在现代操作系统中文件系统是外部存储设备的标准接口它为应用程序使用这些设备中的数据提供了统一的抽象多个应用程序和系统本身可以共享使用这些设备。 在Windows中文件系统的接口部分由I/O管理器定义和实现但文件系统的实现部分位于专门的一类驱动程序中。但文件系统接收到I/O请求时它会根据文件系统格式规范将这些请求转变为更底层的对于外部存储设备的I/O请求通过它们的设备驱动程序来完成原始的I/O请求。 因此文件系统的驱动程序定义了外部存储设备中数据的逻辑结构使得这些数据可直接被操作系统和应用程序使用。 这些文件系统驱动程序负责管理磁盘上的文件和目录处理文件的创建、读取、写入和删除操作提供了文件存储和访问的基本功能。 常见的文件系统 NTFSNT File System这是Windows的原生文件系统其驱动程序为ntfs.sys。NTFS是专门为Windows设计的它提供了许多高级的如元数据支持、数据压缩加密的功能同时支持大型存储卷和大文件。FATFile Allocation Table这是从DOS时代发展起来的文件系统格式格式规范相对简单目前主要用于兼容老版本的操作系统以及用于移动设备以便跨操作系统传送数据。 文件系统的底层是对存储设备的管理。大容量存储设备以“分区Partition”和“卷volume”来管理整个存储空间。 分区是指存储设备上连续的存储区域连续的扇区而卷是指扇区的逻辑集合。一个卷内部的扇区可能来自一个分区也可能来自多个分区甚至来自不同的磁盘。文件系统则是卷内部的逻辑结构。 网络 在Windows操作系统中网络是由一系列网络驱动程序和网络协议栈组成。 Windows内核层中的网络相关组件 网络驱动程序Network Drivers负责管理物理网络接口卡NIC或虚拟网络适配器的通信。协议栈Protocol Stack是一个多层次的协议栈用于处理网络通信。这个协议栈包括了各种网络协议如TCP/IP、UDP、ICMP等。协议栈负责数据包的封装、路由、传输和解包确保数据在网络中的正确传输。套接字Sockets套接字是应用程序与网络协议栈之间的接口允许应用程序创建网络连接、发送和接收数据。Windows内核还提供了套接字API应用程序可以使用这些API与网络进行交互。网络服务Network ServicesWindwos操作系统还提供了各种网络服务如DHCP客户端、DNS客户端、网络发现服务等它们能够进行获取IP地址解析域名或发现网络设备等操作。网络筛选器驱动程序Network Filter Drivers该驱动程序允许实施网络策略和安全性控制如防火墙和安全软件可能会使用网络筛选器驱动程序来监视和过滤网络流量。 Windows为应用程序提供了多种网络API WinsockWindows Sockets 套接字API允许应用程序使用套接字进行网络通信。可以使用Winsock来创建TCP/IP和UDP网络连接发送和接收数据。HTTP API允许应用程序创建HTTP服务器和客户端发送HTTP请求、接收HTTP响应并处理Web服务。WebSocket API这是一种双向通信的说协议允许实时数据传输适用于在线游戏、即时聊天等应用。WebRTC API一种用于实时音视频通信的开放标准可以用于创建支持视频会议、实时音频通话等应用程序。UPnP API一种用于自动发现和配置网络设备的协议。WinINet APIWinINet提供了对Internet资源的访问包括HTTP、FTP和Gopher等协议它允许应用程序进行Web页面下载、文件上传和下载等操作。Network Management API网络管理API允许应用程序管理网络设置、配置网络连接和查看网络状态。 这些网络API都提供了用户模式的动态链接库DLL。当应用程序通过这些DLL发出网络I/O请求时它们将这些请求传递给内核中相应的驱动程序。通常这些网络API要么通过专门的系统服务切换到内核模式比如命名管道和邮件槽就有专门的系统服务要么通过标准的系统服务接口比如NtReadFile、NtWriteFile和NtDeviceIoControlFile由I/O管理器和对象管理器将网络请求转送至对应的驱动程序中。 Windows子系统 Windows子系统是Windows操作系统的组成部分用于支持不同类型的应用程序和环境在Windows平台上运行。每个子系统专门设计用于处理特定类型的应用程序和操作环境。 Windows提供了多种子系统同时在PE文件格式中的SubSystem域指示了可执行文件的子系统类型即程序应在何种环境下运行SubSystem域通常包含一个数字值代表不同的子系统类型。 以下是一些常见的SubSystem及其对应的子系统 Native (0) Native子系统表示该PE文件是一个本地的执行文件通常是驱动程序或操作系统内核组件。这些文件在操作系统内核模式下运行。 Windows GUI (2) Windows GUI子系统表示该PE文件是一个图形用户界面GUI应用程序。它运行在Windows桌面环境中通常有用户界面和窗口。 Windows CUI (3) Windows CUI子系统表示该PE文件是一个字符用户界面CUI应用程序。它通常是命令行应用程序没有图形界面用户通过控制台来与之交互。 OS/2 CUI (5) OS/2 CUI子系统表示该PE文件是一个OS/2字符用户界面应用程序。这种类型的应用程序通常用于运行在IBM OS/2环境中。 Posix CUI (7) Posix CUI子系统表示该PE文件是一个POSIX兼容的字符用户界面应用程序。它适用于在Windows上运行UNIX/Linux应用程序。 Windows子系统中既有用户模式部分也有内核模式部分。内核模式部分的核心是win32k.sys虽然它的形式是一个驱动程序但实际上它并不处理I/O请求相反它向代码提供大量的系统服务。从功能上讲它包含俩部分窗口管理和图形设备接口。其中窗口管理部分负责收集和分发消息以及控制窗口显示和管理屏幕输出图形设备接口部分包含各种形状绘制以及文本输出功能。 窗口管理 Windows子系统的用户界面管理有一个层次结构通常应用程序只是在一个默认的桌面上运行。 每个子系统会话都有自己的会话空间属于某一个会话的资源将会从该会话空间中分配。当用户登录到Windwos中时操作系统为该用户建立一个会话即使用户通过远程桌面或者终端服务连接到一个系统中。系统也会为该用户建立一个单独的会话。 在一个会话中有一个交互式窗口站可能还有非交互式窗口站。在交互式窗口站中通常有三个桌面登录桌面、默认桌面和屏幕保护桌面。交互式窗口站有独立的剪贴板、键盘、鼠标、显示器等在它的三个桌面中任一时刻只有一个是激活的输入输出设备归激活的桌面所有。 在每个桌面都有一个顶级窗口列表这些窗口往往可以相互重叠有系统菜单、最大化/最小化按钮和滚动条等。通常各个图形界面应用程序的主窗口属于当前桌面的顶级窗口。在Windows中窗口可以有子窗口子窗口占据父窗口的客户区域。因此桌面上的窗口形成了一个层次结构。一个窗口下总是可以创建它自己的子窗口。 Windows为常用的窗口定义了一些窗口类window class。窗口类规定了其对象将如何响应各种信息包括系统发送给它的消息和用户触发的消息。 Windows子系统会话有一个RITRaw Input Thread线程负责从输入设备读取原始的输入时间生成消息寄送到正确的线程消息队列。 图形设备接口 Windows的图形引擎有俩方面特点 提供了一套与设备无关的编程接口即GDI这使得应用程序可以适应各种底层显示设备的差异应用程序与图形设备驱动之间通信足够高效。在频繁输出和刷新图形元素的情况下windows也能提供良好的视觉效果。 上图是Windows子系统定义的图形体系结构。win32k.sys通过DDI显示设备驱动程序接口与现实驱动程序打交道而显示驱动程序通过ENG图形引擎接口调用Win32k.sys中图形引擎的功能。 视频端口驱动程序实际上是一个动态链接库用于辅助视频小端口驱动程序实现一些公共的、与图形有关的功能以及为小端口驱动程序提供一个与系统内核和执行体打交道的环境。视频小端口驱动程序则直接负责的硬件资源管理和控制。 系统线程和系统进程 系统线程则是一些特殊线程与普通用户线程不同系统线程不属于任何特定的用户进程它直接运行在内核模式下。 一些常见的系统线程 Idle线程它的任务是在系统没有其他任务要执行时占用CPU周期并降低CPU功耗它通常属于最低优先级以确保在需要时可以立即释放CPU资源给其他任务。Deferred Procedure Call (DPC) 线程DPC线程是用于处理延迟的硬件中断请求的系统线程。当硬件设备产生中断请求时DPC线程负责处理这些请求并执行相应的处理程序。System线程System线程执行一些关键的内核操作如系统调度、中断处理、内存管理等。它是操作系统的核心部分用于协调和管理其他系统线程和用户进程。 系统线程中还有一组系统辅助线程system worker thred它们代表操作系统或者其他的应用进程来完成一些特殊的工作。实际上系统辅助线程是一个线程池Windows在系统初始化时创建了一定数量的辅助线程而且随着辅助线程的负载的变化执行体也会动态地创建一些辅助线程以满足系统负载的变化需求。 在Windows操作系统中有一些重要的系统进程它们负责管理和控制操作系统的不同方面。 一些常见的系统进程 系统空闲进程Idle该进程的PID为0其中每个处理器或核对应有一个线程。System 进程这是操作系统的好恶心进程PID为4。它负责管理内核模式下线程、设备驱动程序、中断处理和其他核心人物。会话管理器smss.exeWindows系统中创建的第一个用户模式进程在Windows启动过程中创建环境变量启动了子系统进程csrss.exe和登录进程winlogon.exe。另外它还负责创建新的终端服务器会话包括建立会话空间的数据结构为新建的终端服务器加载子系统。登录进程winlogon.exe负责处理交互用户的登录和注销。Windows子系统进程csrss.exe负责为用户提供一个子系统环境。本地安全权威子系统进程lsass.exe负责本地系统安全策略。Shell进程explorer.exeWindows的默认Shell它提供了系统与用户打交道的各种界面包括开始菜单、任务栏、资源管理窗口等几乎所有Windows用户都熟悉的界面。服务控制管理器services.exe负责Windows的系统服务指一些特殊的进程。 内核基本概念 Windows内核中的各个组件并非单纯的独立模块相反地组件之间不可避免地包含了复杂的依赖关系甚至存在交叉引用。下面是一些Windows内核中的基本概念。 处理器模式 在Intel x86处理器上段描述符有一个2位长度的特权级0表示最高特权级3表示最低特权级。也就是CPU的权限级别0环和3环分别对应内核模式和用户模式。 处理器有许多指令只有在零环内才可以使用例如I/O指令、操纵内部寄存器指令等当处理器处于用户模式时它处于一种相对隔离的状态能够执行的指令有限能够访问的内存也是有限的用户代码和内核代码有各自的运行环境。一旦越过这些限制就会引发处理器异常此时操作系统会捕获这些异常并决定处理器是否继续执行。 用户模式下处理器只能访问用户地址空间而在内核模式下处理器不仅可以访问用户地址空间也可以访问系统地址空间。在内核模式下的代码和数据都是共享的所有的进程一旦其指令流进入到内核模式下则系统地址空间的代码和护具都是相同的。 一个指令流即线程在执行时在以下情况会发生模式切换 用户模式代码触发了异常则控制流进入到内核模式内核中的异常处理函数可以决定该控制流是否继续执行。用户模式代码执行时被一个中断打断控制流进入特权模式等中断处理例程完成后它若调用iret/iretd指令则控制流恢复到用户模式下。执行特殊的模式切换指令如Intel x86的sysenter指令从用户模式切换到内核模式。若想从内核模式切换到用户模式1通常使用sysexit、iret/iretd这样的指令。 由于系统空间是所有进程共享的所以任何一个进程在执行内核模式的代码时实际上是在使用操作系统的服务。在Windows体系结构中内核模式向上优一个执行体API对于应用程序而言这便是系统服务。 Windows将这些系统服务组织成了一张表称为SDTService Descriptor Table服务描述符表。 内存管理 任何一个进程都定义了它自己完整的4GB地址空间虚拟内存空间在内存空间分布一图中将其划分成2GB内核空间以及2GB应用空间换句话说内核空间是所有进程共享的也称作系统地址空间剩下的2GB空间才是它自己私有的也叫进程地址空间。 为了有效管理2GB的系统地址空间Windows将2GB划分成了一些固定的区域主要包括内核模块映像、PFN数据库、换页内存池、非换页内存池、会话空间、系统缓存区、系统视图以及页表等。 分页机制 Windows使用分页机制管理虚拟内存和物理内存。它将虚拟内存和物理内存划分成固定大小的页面通过映射这些页面来实现虚拟地址到物理地址的转换。 通常操作系统将内存划分为大小固定的页面通常为 4KB、8KB 或其他大小。这些页面是虚拟内存和物理内存的基本单位之后操作系统将进程的虚拟地址空间也划分成页面大小的块。当程序访问进程的虚拟地址时操作系统将虚拟地址转化成相应的物理地址。 为了实现虚拟地址到物理地址的转换需要使用到页面表。 页面表 是操作系统中的一个数据结构用于记录虚拟地址空间中每个页面与实际物理内存中的对应关系。页面表的条目存储了虚拟页号到物理页号的映射关系。页面表中的每个条目称为页表项Page Table EntryPTE。每个 PTE 存储了虚拟页号到物理页号的映射以及一些额外的控制信息例如页面是否在物理内存中、是否被修改等。 当程序访问进程的虚拟地址时MMU负责将这个虚拟地址通过页面表转化成物理地址。 如果虚拟页已经在物理内存中则直接获取物理地址。如果虚拟页不在物理内存中就需要进行页面调度。 页面调度 如果虚拟页不在物理内存中会先引发一个 缺页异常。这时操作系统需要根据页表中的信息确定要将哪一页加载到物理内存中。 然后操作系统会将当前没用的物理页写入磁盘中将需要的虚拟页加载入物理页。 从内存中获取数据的过程 程序访问进程的虚拟地址MMU在通过页面表查询虚拟地址对应的虚拟页是否在物理内存中若在直接获取物理地址返回数据若不在引发缺页异常MMU在页面表中查找对应的虚拟页通过页面调度将虚拟页加载到物理内存中获取物理地址返回数据。 ​ 至于数据在物理内存中还是虚拟内存中是没有规律的取决于数据使用的频繁程度。 内存页面管理算法 在系统地址空间中不同的区域使用并不完全相同的内存页面管理算法较为典型的有以下三种 非换页内存池这部分内存区域在初始化时就已经被映射到物理页面所以Windows利用空闲链表的做法按照不同的粒度1、2、3、4个页面大小将空闲页面链接起来。空闲页面本身即链表中的节点因而这些链表无需额外的内存空间除了头节点。申请和释放页面的操作实际上是针对空闲链表来进行的。换页内存池在换页内存池区域空闲的页面并没有被映射好物理页面Windows使用位图来管理页面的分配。分配连续的多个页面即从位图中找到连续的零位。系统PTE区域这部分内存区域存放的并非PTE而只是表示这部分地址范围是以PTE的形式来管理的即把PTE当做资源来管理。当内核需要一段虚拟地址来映射物理页面时它可以使用系统PTE区域中的地址。 以上这些内存区域按照页面粒度来管理其分配情况Windows执行体在这些系统内存区域管理的基础上还提供了一组更小的粒度8B的倍数最小位8B的内存管理包括执行体换页内存池和执行体非换页内存池。这些内存池通过空闲链表记录下每个已申请页面中的空闲内存块当释放内存时自动与相邻的空闲块合并以构成更大的空闲内存块。内核其他组件或驱动程序通过执行体暴露的API函数例如ExAllocatePoolWithTag和ExFreePoolWithtag来使用这些内存池。 进程地址空间是随进程一起被创建的每个进程都有它自己的页目录页面其中有一半的**页目录项PDE**是共享的即系统地址空间部分余下一半初始化为零。随着进程中的映像文件包括.exe文件和各DLL文件被加载进来以及各个模块的初始化代码被执行进程地址空间将被建立起来。 进程地址空间按照其虚拟地址是否被分配或保留来进行管理用户模式代码通过Windows API函数 VirtualAlloc 和 VirtualFree来申请或释放地址范围而内核中的虚拟内存管理器则通过一颗平衡二叉树来管理进程地址空间被使用的情况。数中的每个节点为VAD虚拟地址描述符Virtual Address Descriptor描述了一段连续的地址方位。 在VAD树中有一种重要的节点类型为内存区对象section object它是Windows平台上俩个或多个进程之间共享内存的一种方式。 除了对系统地址空间和进程地址空间的管理内存管理器另一个重要的任务是管理有限的物理内存。在WIndows的系统地址空间中专门保留了一个称为**PFN数据库Page Frame Number Database页帧编号数据库**的区域。 当系统中的进程需要使用大量内存时内存管理其如何将有限的物理页面分配给那些需要使用内存的进程利用Windows工作集管理器。工作集working set是指一个进程当前正在使用的物理页面的集合。Windows系统中除了进程工作集还有系统工作集即系统空间中动态映射的页面集合和会话工作集即会话空间中的代码和数据区。 工作集管理器运行在一个称为平衡管理器balance set manager的线程中它的作用除了触发工作集管理器还定期触发进程/栈交换器process/stack swapper。进程/栈交换是另一个单独的线程一旦被唤醒就会将满足特定条件的进程和栈换入内存或换出内存。 进程和线程管理 **进程process**定义了一个执行环境包括它自己的私有空间、一个句柄表、以及一个安全环境线程thread是一个控制流有自己的调用栈call stack记录它的执行历史。 一个进程包含一个或多个线程。 如图用户模式下的进程只能访问进程地址空间若在内核模式下就可以访问真个地址空间。 在Windows内核结构中进程和线程的核心机制是在微内核中实现的而管理机制是在执行体中实现的。例如微内核负责线程调度而线程进程的创建和初始化由执行体完成。 windows实现了抢占式线程调度每个线程都有一个基本优先级和动态优先级。本质上每个线程都处于俩种状态之一满足继续执行的条件正在排队或已经执行不满足继续执行的条件处于等待状态或者它的调用栈升职所处的进程已经被换出内存。在前一种情况下线程按照优先级排队执行对于多处理器系统排队过程要更为复杂不仅要处理多个队列还要考虑每个处理器的就绪线程队列的平衡程度。还需要考虑处理器亲和性。 关于作业和迁程**作业job**是一个执行体支持的内核对象它使得一个或多个进程被当做一个整体来加以管理和控制。管理程序通过Windows API 可以控制一个作业小号系统资源CPU或内存的各种限制例如用户模式CPU时间的限制、进程的处理器亲和性、工作集的最大值和最小值、虚拟内存的使用限制等。**迁程fiber**是一种用户线程它对于内核是不可见的由kernel32.dll实现。应用程序可以在一个线程环境中创建多个迁程然后手动控制它们的执行。迁程不会被自动执行应用程序必须显式地选择某个迁程来执行而且一旦迁程运行起来要么一直运行到它退出要么运行到它显式地切换至另一个迁程。 中断和异常 **中断interrupt**是指处理器外部事件如硬件设备触发的信号它会中断当前的处理器活动。**异常Exceptions**指程序执行过程中出现的非正常或意外情况由处理器内部事件如执行了错误指令触发。 尽管中断和异常的触发来源和方式不同但Intel x86处理器内部使用同一套陷阱机制来处理中断和异常它利用IDTInterrupt Descriptor Table中断描述符表将每个中断或异常与一个处理该中断或异常的服务例程联系起来因而一旦发生异常或中断该相应的服务例程将被执行。Windows在此基础上添加了一种更灵活的机制允许设备驱动程序为特定的中断向量添加它的中断服务例程ISRInterrupt Service Routine。一个中断向量允许连接多个中断对象interrupt object这里中断对象是一种封装了中断服务例程的内核对象。当中断发生时这些中断对象中的服务例程都有机会处理该中断。通过中断对象机制设备驱动程序可以在不操纵IDT的情况下加入它们的中断服务例程另一方面多个硬件设备也可以共享同样的硬件中断向量。 执行体层中介绍过中断请求级别IRQL。 异常是程序指令流执行过程中的同步处理过程既可以由处理器硬件产生也可以由指令流软件产生。Windows为所有需要处理的异常都提供了异常处理器exception handler即异常处理例程。 同步 在现代操作系统中由于多处理器、多核或者中断各种并发性concurrency因素的存在同样的代码可能被并发执行而数据也可能被并发访问。在这种情况下对于可能被并发访问的数据进行必要的同步synchronization保护是一种常见的编程实践。 一些同步中会遇到的概念 关于锁。什么是锁锁是一种同步机制用于确保在同一时刻只有一个线程能够访问共享资源也就是保护临界区确保在任何时刻只有一个线程可以进入临界区执行操作。锁包括互斥锁、自旋锁、读写锁等不同类型。临界区。什么临界区临界区是用于保护共享资源免受多个线程同时访问的一种同步机制当一个线程进入临界区时其他线程必须等待直到第一个线程离开临界区。常用于用户模式下。 Windows根据执行环境中的IRQL大于APC_LEVEL 或者等于PASSIVE_LEVEL将同步机制分为“不依赖线程调度的同步机制”和“基于线程调度的同步机制”。 不依赖线程调度的同步机制主要是在IRQL的高优先级下执行的通常用于中断处理程序和内核模式代码中以确保在处理中断或执行关键内核代码时不会被其他线程打断。常见的不依赖线程调度的同步机制包括 自旋锁Spin Lock自旋锁用于在多个线程之间互斥的访问共享资源本质上是一种忙等待busy-wait意思是线程会一直自旋忙等待直到锁可用为止而不会被挂起等待。常使用在高IRQL下因为此时是不允许切换线程的使用自旋锁可以确保关键代码不会被其他线程打断。一些自旋锁扩展执行体自旋锁支持共享和独占的语义、排队自旋锁queued spin lock和栈内排队自旋锁in-stack queued spin lock。中断服务例程ISRISR用于响应硬件中断当硬件设备触发中断时操作系统会立即执行ISR来处理中断。ISR运行在IRQL的高优先级下不允许进行线程调度以确保快速响应中断。延迟过程调用Deferred Procedure CallDPCDPC用于延迟执行一些代码块或处理程序常与中断处理有关。当硬件设备触发中断时操作系统会将**中断服务例程ISR**用于快速响应中断但有时需要执行一些耗时的操作例如数据传输或资源释放这时就会使用DPC来延迟执行这些操作。 另一种基于线程调度的同步机制当一个线程的执行条件不满足时该线程进入等待状态系统将控制权交由其他满足执行条件但没有得到处理器资源的线程以后当该线程的执行条件满足时它又有机会继续执行。这里的执行条件正是Windows提供的线程同步机制中的语义。Windows定义了统一的机制来支持各种线程同步原语分发器对象dispatcher object其数据结构头部为DISAPATCH_HEADER。 常见的分发器对象 事件event用于线程之间的通信和同步它有俩种状态已触发和未触发。事件可以用于线程等待某个事件发生或者通知其他线程事件的发生。互斥量Mutex互斥量用于确保在同一时刻只有一个线程能够访问共享资源。它允许线程请求锁定当一个线程获得锁定时其他线程必须等待直到锁被释放。信号量Semaphore用于控制对共享资源的并发访问。它维护一个计数器允许指定数量的线程同时访问资源。条件变量Condition Variable条件变量用于线程之间传递信号和等待特定条件的发生。通常与互斥量一起使用用于等待某个条件满足后执行操作。读写锁Read-Write Locks读写锁用于控制对共享资源的读和写它允许多个线程同时读取资源但只允许一个线程写入资源。计数器对象Counting Semaphore一种特殊的信号量它可以增加和减少计数器的值通常用于跟踪资源的可用性或完成的任务数量。 **互斥锁Mutex**是一种基于线程调度的同步机制它用于确保在同一时刻只有一个线程能够访问共享资源。当一个线程获得互斥锁的所有权后其他线程必须等待直到该线程释放锁。 关于互斥锁和自旋锁互斥锁基于线程调度而自旋锁不依赖线程调度还有一个区别是线程尝试获取锁时如果该锁被占用线程是被挂起还是一直自旋互斥锁适用于长时间的临界区和资源竞争激烈的情况而自旋锁适用于非常短暂的临界区。 Windows在上述基础上实现了同步语义更为丰富的一些同步机制包括快速互斥体fast mutex、守护互斥体guarded mutex、执行体资源executive resource和推锁push lock。 内核重要数据结构 windows内核中一些常见的数据结构。 内核对象 内核对象是Windows内核中一种重要的数据结构管理机制。应用层的进程、线程、文件、驱动模块、事件、信号量等对象或者打开的句柄在内核中都有与之对应的内核对象。 如图一个Windows内核对象可以分为对象头和对象体俩部分。在对象头中至少有一个OBJECT_HEADER和对象额外信息。对象体紧接着对象头中的OBJECT_HEADER。一个对象指针总是指向对象体而不是对象头。如果要访问对象头需要将对象体指针减去一个特定的偏移值以获取OBJECT_HEADER结构通过OBJECT_HEADER结构定位从而访问其他对象结构辅助。对象体内部一般会有1个type和1个size成员用来表示对象的类型和大小。 Windows内核对象可以分为如下3种类型 Dispatcher对象 这种对象在对象体开始位置了一个公共数据结构DISPATCHER_HEADER其结构代码如下 包含了DISPATCHER_HEADER结构的内核对象都以字母“K”开头表明这是一个内核对象例如KPROCESS、KTHREAD但以字母“K”开头的内核对象不一定是Dispatcher对象。包含该结构的内核对象都是可以等待的waitable也就是说这些内核对象可以作为参数传给内核的KewaitForSingleObject()和KeWaitForMultipleObjects()函数以及应用层的WaitForSingleObject()和WaitForMultipleObject()函数。 I/O对象 I/O对象在对象体开始位置没有DISPATCHER_HEADER结构但通常会放置一个与type和size有关的整型成员以表示该内核对象的类型例如文件内核对象的类型为26和大小。常见的I/O对象包括DEVICE_OBJECT、DRIVER_OBJECT、FILE_OBJECT等。 其他对象 除了Dispatcher对象和I/O对象剩下的都属于其他内核对象。其中有俩个常用的内核对象分别是进程对象EPROCESS和线程对象ETHREAD。 EPROCESS用于在内核中管理进程的各种信息如进程ID、进程状态、内存管理信息等。所有进程的EPROCESS内核结构都被放入一个双向链表R3在枚举系统进程的时候通过遍历这个链表获得了进程的列表。因此有的Rookit会试图将自己进程的EPROCESS结构从这个链表摘掉从而达到隐藏自己的目的。 EPROCESS结构中的一些关键数据如下 调用下面俩个内核函数可以获得进程的EPROCESS结果。 PsLookupProcessByProcessId()函数根据进程PID拿到进程的EPROCESS结构PsGetGurrentProcess()函数直接获取当前进程的EPROCESS结构。 ETHREAD结构是线程的内核管理对象。它代表Windows中的一个线程包含了线程的执行上下文、调度信息。 EPROCESS、KPROCESS、ETHREAD、KTHREAD结构之间的关系如下图。 可以看出EPROCESS和ETHREAD结构都是通过双向循环链表组织管理的。一个EPROCESS结构中包含一个KPROCESS结构而在一个KPROCESS结构中又有一个指向ETHREAD结构的指针。在ETHREAD结构中又包含了KTHREAD结构成员。 SSDT **系统服务描述表System Services Descriptor TableSSDT**其在内核中的实际名称是 “KeServiceDescriptorTable”。 它用于处理应用层通过kernel32.dll下发的各个API操作请求。ntdll.dll中的API是一个简单的包装函数当kernel32.dll中的API通过ntdll.dll时会先完成对参数的检查再调用一个中断int 2Eh或者SysEnter指令从而实现从R3层进入R0层并将要调用的服务号也就是SSDT数组中的索引号index值存放到寄存器EAX中最后根据存在EAX中的索引值在SSDT数组中调用指定的服务Nt*系列函数。如下图 SSDT表的结构定义 #pragma pack(1) typedef struct ServiceDescriptorEntry {unsigned int *ServiceTableBase; //表的基地址unsigned int *ServiceCounterTableBase;unsigned int NumberOfServices; //表中服务的个数unsigned char *ParamTableBase; } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; #pragma pack()其中较为重要的俩个成员为ServiceTableBaseSSDT表的基地址和NumberOfServices表示系统中SSDT服务函数的个数。SSDT表实际上是一个连续存放该函数指针的数组。 SSDT表的导入方法 __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;由此可以知道SSDT表的基地址和SSDT函数的索引号index从而求出对应的服务函数地址。在x86平台上它们之间满足如下规则 FuncAddr KeServiceDescriptorTable 4 * index与x86平台上直接在SSDT中存放SSDT函数地址不同在x64平台上SSDT中存放的是索引号锁对象的SSDT函数地址和SSDT表基地址的偏移量左移4位的值因而计算公式变为 FuncAddr ([KeServiceDescriptorTable index * 4] 4 KeServiceDescriptorTable)通过这个公式只要知道SSDT表的基地址和对应函数的索引号就可以将对应位置的服务函数替换成自己的函数从而完成SSDT Hook过程了。 PEB 操作系统会为每个进程设置一个数据结构用来记录进程的相关信息。该结构就是PEBProcess Environment Block进程环境块PEB存在于用户地址空间中记录了进程的相关信息。 在NT中PEB位于进程空间的FS:[0x30]处。同时TEB中的 ProcessEnvironmentBlock 就是PEB结构的地址其结构的0x30偏移处是一个指向PEB的指针。 因此访问PEB有俩种方法 直接获取 mov eax, dword ptr fs:[30h] ; fs:[30]里存放即是PEB地址通过TEB获取 mov eax, dword ptr fs:[18h] ;此时eax里为TEB的指针 mov eax, dword ptr [eax30h] ;此时eax里为PEB的指针PEB结构部分 其中BeingDebugged成员用于指定该进程是否处于被调试状态该值为0时进程未处于调试状态若该值为非零值则进程处于调试状态。可以使用Windows API如IsDebuggerPresent、CheckRemoteDebuggerPresent函数来访问该成员 Ldr字段也是一个很重要的成员该字段指向的结构记录了进程加载进内存的所有模块的基地址通过Ldr指向的三个链表就可以找到kernel32.dll的基地址。 TEB **TEBThread Environment Block线程环境块**同样位于应用层之中。它包含了系统频繁使用的一些与线程相关的数据进程中的每个线程都有一个自己的TEB。一个进程的所有TEB都存放在从0x7FFDE000开始的线性内存中每4KB为一个完整的TEB。 在NT中FS:[0]的地址指向了TEB结构这个结构的开头是一个NT_TIB结构具体部分如下 NT_TIB结构的0x18偏移处是一个Self指针指向这个结构自身也就是TEB结构的开头。TEB结构的0x30偏移处是一个指向PEB的指针。 在TEB结构的0xE10偏移处有个字段TlsSlots[]是一个无类型的指针数组TLS存储槽它的大小是40h字节。也就是说一个线程同时存在的动态TLS不能超过64项。 可以通过NtCurrentTeb函数调用和FS段寄存器俩种方法来访问TEB结构 NtCurrentTeb函数调用 FS段寄存器访问 mov eax, dword ptr fs:[18h] 注册表 Windows注册表也可以被视为一种特殊的数据结构它是一个层次结构数据库用于存储和组织系统配置信息、应用程序设置和其他系统相关的数据。 Windows提供了一些API供应用程序访问注册表例如RegOpenKeyEx、RegCreateKeyEx等。这些API运行开发人员在应用程序中读取、写入、编辑和删除注册表中的键值和数据。 在Win10中通过WinR输入regedit即可查看注册表。 如上图Windows注册表是一个树状层次结构 每个节点是一个键key或值value。键是一个容器好比文件系统中的目录它可以包含其他的键子键和值。注册表中的每个键都有一个唯一的名称用于标识它。值存储的是数据好比是文件系统中的文件。数据可以是字符串、整数、二进制数据等不同的类型。注册表的根也是一个键称为根键。一般为5个根键常见的根键包括HKEY_LOCAL_MACHINE存储计算机范围的配置信息、HKEY_CURRENT_USER存储当前用户的配置信息等。 在内核之中执行体包含了一个称为“配置管理器”的组件它是注册表的真正实现。
http://www.zqtcl.cn/news/708157/

相关文章:

  • 小游戏网站模板无锡网站建设818gx
  • 娄底做网站陕西网站维护
  • 电子商务网站建设首要问题是佛山网站设计步骤
  • iphone网站哈尔滨做平台网站平台公司吗
  • 公司网站制作高端有什么网站可以做外贸出口信息
  • 旅游网站建设ppt自己动手制作网站
  • 做注册任务的网站有哪些seo搜索排名优化
  • 用php做网站和go做网站网站建设 完成
  • 做平面设计在那个网站上找图好网站广告出价平台
  • 网站点击率查询wordpress忘记后台账号
  • 网站怎么做全屏的网站建设报价比较表
  • 商城网站项目案例简单的明星个人网站建设论文
  • 腾讯云建网站如何利用谷歌云做自己的网站
  • 合肥网站搭建著名的网站建设公司
  • win7的iis怎么制作网站网页制作基础代码
  • 黄页网站大全免费网在线进一步优化供给推动消费平稳增长
  • dw中怎样做网站链接网页版qq登录入口账号密码
  • 外贸网站建设soho中国建设银行网站易方达消费
  • 淘宝客网站推广怎么做图文识别微信小程序是什么
  • 郑州网站建设、北京做网页公司
  • 代码错误网站wordpress主题屏蔽更新
  • 建五金方面的网站广告联盟app手机版
  • 宜宾建设网站公众号怎么制作流程
  • 上海崇明网站建设崇信县门户网站首页
  • 北京手机版建站系统开发学网页设计需要什么学历
  • 英文网站备案互联网排名前十的公司2021
  • 网站外部外链建设如何开发wordpress主题
  • 个人网站首页内容辽宁省建设网站
  • 二建证从住房建设厅网站调出流程需求分析 网站
  • 鞋子网站模板做网站开发学什么软件