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默认不能显示行号,使 ...
随机推荐
- 【iCore3 双核心板_FPGA】例程十三:FSMC总线通信实验——复用地址模式
实验指导书及代码包下载: http://pan.baidu.com/s/1nuYpI8x iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- Excel文件读写
C#读写Excel的方式有好几种,具体参考文章: http://www.cnblogs.com/huipengkankan/archive/2011/07/28/2120407.html 昨天大致研究 ...
- mysql笔记(存储引擎)
读写锁:. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高. 页面锁:开销和 ...
- 【后台测试】手把手教你jmeter压测
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5611555.html 我知道我迟早是要踏上了后台测试之路 ...
- C#编程利器之三:接口(Interface)【转】
C#编程利器之三:接口(Interface) C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法,通过继承与他的子类来完成具体的实现.但没有真正认识接口的作用的时 ...
- mongodb的使用
1.启动mongodb 启动mongodb在Linux中可以进入mongodb的bin目录下执行 ./mongod -dbpath=所建立的数据文件夹 -logpath=所建立的日志文件 ...
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
- perl基础
perl比较好的博客:http://www.cnblogs.com/cosiray/archive/2012/03/18/2404371.html 以分析一个简单的pm文件为例 # # オプションの取 ...
- Git push 常见用法
Git push 在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,g ...
- MyBatis操作指南-搭建项目基础环境(基于XML)含log4j配置