Windows Internals学习笔记(六)Windows关键系统组件
参考资料:
1. 《Windows Internals》
3. Ntoskrnl.exe
4. Livekd的使用
5. WinDbg的使用(一)
6. WinDbg的使用(二)
Now, let's delve into the internal structure & the role each key OS component plays at the high-level achitecture. ^-^
知识点:
● 先上图,下图是windows系统结构。

图1 Windows系统结构
● 环境子系统将基础Windows执行系统的服务的某些子集暴露给应用程序。每个子系统都提供对不同本地服务子集的访问(子系统的功能不尽相同)。每一个可执行镜像文件(.exe文件)都会绑定到一个且仅一个子系统。另外,用户程序是通过子系统来间接调用Windows系统服务的,而不是直接调用。可以使用Dependency Walker查看镜像的子系统类型。

图2 使用DW查看镜像子系统类型
● 环境子系统将由Session Manager(smss.exe)启动。子系统启动信息存储在HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems中。
● Ntdll.dll是一个主要为了支持使用子系统DLL的特殊系统支持库。它包含两类函数:①到Windows执行系统服务的系统服务派发存根(即提供到Windows执行系统服务的接口供用户模式使用)。②内部支持函数,被子系统、子系统DLLs和其它镜像使用。Ntdll包含的支持函数包括:镜像加载器(以Ldr开头的函数)、堆管理器、Windows子系统进程交互函数(以Csr开头的函数)、通用运行时库例程(以Rtl开头的函数)、支持用户模式调试的函数(以DbgUi开头)、Windows时间追踪(以Etw开头)以及用户模式下的APC和异常 dispatcher。最后,它还包含C Run-Time(CRT)例程(限制memcpy、strcpy、itoa等部分例程,主要跟C语言相关)。
● Windows执行程序是Ntoskrnl.exe的上层。Ntoskrnl.exe即内核镜像,是Windows系统的基础部分,提供Windows NT内核空间的内核和执行程序层(接口),对诸如硬件抽象 & 进程和内存管理负责。它包含Cache管理器、执行程序、内核、安全引用监视、内存管理器和调度器。
● Kernel由一组提供基础机制(如线程调度和同步服务)的函数组成,这些函数被执行程序组件使用和对依赖硬件架构的底层提供支持(interrupt&exception dispatching)。内核代码主要由C写的,而汇编代码将负责访问特殊处理器指令和寄存器。
● Kernel提供良好定义的且可预测的系统原子操作和机制的底层基础,以供高层执行程序的组件使用。Kernel将它自己与剩余的执行程序通过实现操作系统机制和避免决策进行隔离。除了线程调度和派发由Kernel实现外,其余所有决策都由执行程序决定。
● Kernel之外,执行程序将线程和其它可共享资源都表示为对象(objects)。这些对象需要加一些决策(或策略)在头部,而这些头部信息会在Kernel中被省略,且这些对象会被称为内核对象(kernel objects)。内核对象中,有一部分对象被称为控制对象(control objects),用于建立控制不同操作系统函数的语义学。包括:APC对象、DPC(deferred procedure call)对象以及一些I/O管理器使用的对象(如,中断对象)。而另一部分对象则被称为派发对象(dispatcher objects),包含改变和影响线程调度的同步能力。包括:kernel thread、mutex、event、kernel event pair、semaphore、timer和可等待timer。执行程序使用内核函数创建内核对象的实例,然后操作它们,甚至组件更复杂的对象以供用户模式下使用。
● Kernel使用的数据结构叫做内核处理器控制区KPCR(kernel processor control region),用来存储特定处理器数据。KPCR包含诸如IDT、TSS和GDT的基本信息,同时也包含中断控制器的状态。为方便对KPCR的访问,内核存储了一个指向它的指针在FS寄存器中(32-bit)或GS寄存器中(x64),而在IA64中它则存于0xE000 0000 FFFF 0000中。另外,在KPCR中包含了一个叫做内核处理器控制块KPRCB(kernel processor control block)的嵌入式数据结构,且该结构是一个只在内核模式下和在Ntoskrnl.exe中使用的私有结构。它包含了调度信息(比如:当前、下一个和空闲线程供处理器调度执行)、处理器的派发器数据库、DPC队列、CPU供应商和标识符信息、CPU和NUMA拓扑结构、Cache的大小、时间计数信息和处理器统计数据等等。KPRCB有时会被用于存储cache-aligned & per-processor结构,以供内存优化访问(特别是在NUMA系统中)。最后,可以通过!pcr和!prcb命令查看它们的内容。
● Kernel使另外一个重要的任务就是抽象或隔离执行程序&设备驱动与在Windows支持的硬件体系结构的变动(即使执行程序&设备驱动与硬件无关)。
● HAL(Hardware Abstraction Layer)是一个可加载的内核态模块(Hal.dll),向Windows所运行的硬件平台提供低级接口。HAL的routines可在WDK的文档中找到。
● Device Drivers是可加载的内核模块(通常以.sys结尾),它们担任着I/O管理器和相关硬件之间接口的作用,通常是用C或C++书写的,通过调用HAL提供的接口与硬件进行交互。WDF(Windows Driver Foundation)提供了KMDF(Kernel-Mode Driver Framework)和UMDF(User-Mode Driver Framework)以简化了Windows驱动的开发。前者支持Win 2000SP4及后来者,后者支持Win XP及后来者。
Windows Internals学习笔记(六)Windows关键系统组件的更多相关文章
- Windows Internals学习笔记(二)系统架构
参考资料: 1. <Windows Internals> 2. http://bestcbooks.com 3. Windows Drive Kit 4. Microsoft Window ...
- Windows Internals学习笔记(八)IO系统
参考资料: 1. <Windows Internals> 知识点: ● 当一个进
- Windows Internals学习笔记(七)Image Loader
参考资料: 1. <Windows Internals> 2. Fibers 知识点: ● 当一个进程在系统上启动时,内核将创建一个进程对象来代表它,并执行各种内核相关的初始化任务.然而, ...
- Windows Internals学习笔记(四)Trap Dispatching
参考资料: 1. <Windows Internals> 知识点: ● 陷阱trap:它是一种处理器机制,用以在某一异常或中断出现时,捕捉该执行线程,并将其控制权转交到操作系统中某一固定位 ...
- Windows Internals学习笔记(一)概念与工具
参考资料: 1. <Windows Internals> 2. Windows Drive Kit 3. Microsoft Windows SDK 4. WDK下载地址 知识点: 1. ...
- Windows Internals学习笔记(五)Synchronization
参考资料: 1. <Windows Internals> 2. 自旋锁spinlock剖析与改进 3. Lock指令前缀 4. Lock指令前缀(二) 5. Kernel Dispatch ...
- Windows Internals学习笔记(三)Procdump的使用
参考资料: 1. 下载地址 2. 使用示例
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
随机推荐
- LeetCode | Single Number II【转】
题目:Given an array of integers, every element appears three times except for one. Find that single on ...
- mysql查询结果添加编号
第一种方法: select (@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it 第二种方 ...
- PHPExcel导出数据
require_once './class/Excel/PHPExcel.php'; //将(1,1)转换成"A1"形式 function getCoordinate($row, ...
- Android RecyclerView的基本使用
Android RecyclerView 在去年的Google I/O大会上就推出来了,以前经常使用的ListView 继承的是AbsListView,而RecyclerView则直接继承 ViewG ...
- 一些IT中的工具介绍【转】
1. 史上最全github使用方法:github入门到精通 2. Git教程 3. GIT与GitHub使用简介 简单来说,git是一种版本控制系统.跟svn.cvs是同级的概念.github是一 ...
- C# DataGrid合并单元格
1.栏位枚举 private enum DataGridColumn { ROWNUM = , EMPID, EMPNAME, SEX, SALARY, ADRRESS, PHONE, TEL, PO ...
- Fiddler-010-网络延时应用小技巧-模拟低网速环境
在日常的网络测试中,经常需要测试网络超时或在网络传输速率不佳的情况的应用场景,而与此同时我们有时手边资源有限,实现在各种真实网络(2G\3G)环境下测试有些局限性.其实 fiddler 已经提供了类似 ...
- Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略
在项目中,之前公司是使用IIS 7.0官方的URL重写模块,官方的使用说明请参见官方URLRewrite ,添加伪静态支持,后来经理问我有没有涉及伪静态,我说之前项目中我一直是用Intelligen ...
- LUA表克隆方法归纳
lua表克隆 将lua一个表, 克隆出一份为一个独立的另外一个表. 对于一个module, 如果在require之后,获得的表对象, 不能直接修改, 例如lua缓存此表, 但是多次逻辑执行, 都使用的 ...
- AngularJS Best Practices: pretty urls
By default, AngularJS will route URLs with a hashtag. For example: http://example.com/ http://exampl ...