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默认不能显示行号,使 ...
随机推荐
- 省略号 对单行 多行的css
.twoline{ display: -webkit-box !important;; overflow:hidden; text-overflow: ellipsis; word-break: br ...
- DS实验题 PlayGame Kruskal(UnionFindSet)
题目: 思路: 有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考:最小生成树-Prim算法和Kruskal算法,讲的已经是十分清楚了. 具体算 ...
- Ajax 无刷新上传文件插件 uploadify 的使用
在表单中无法直接使用 Ajax 上传文件,解决的思路可以是使用插件无刷新地上传文件,返回文件上传后的地址,然后把该地址作为 Ajax 的参数传递给服务器端进行数据库处理.可以使用 uploadify ...
- json解析jackson ,Gson,等知识总结
相关资料链接: Java构造和解析json数据的两种方法详解 java解析json Android网络之数据分析---使用Google Gson 解析Json数据 使用jackson在java中处理j ...
- phpcmsv9的评论分表策略
comment_table表 comment表 comment_data_x表 我们留意到: comment_table表统计每个comment_data_x表里面有多少条记录, comment表只是 ...
- WCF初识
WCF能干什么? 在win32中,应用程序是运行在进程的线程中的,.NET出现之后,出现了AppDomain,其实就相当于在进程和线程之间又又了一层包装层,类似于子进程的概念,在一个进程或者应用程序域 ...
- web前端开发工程师,你了解吗?
web前端开发工程师可以说是一个全新的职业,在IT整个行业中真正受到重视的时间没有超过5年,也正因为这样,大家越来越想了解web前端工程师的前景究竟怎么样?web前端培训就业前景如何?web前端工程师 ...
- 使用curl命令操作elasticsearch
使用curl命令操作elasticsearch 大岩不灿 发表于 2015年4月25日 浏览 7,426 次 第一:_cat系列_cat系列提供了一系列查询elasticsearch集群状态的接口.你 ...
- 解决编译错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
http://www.cnblogs.com/oymx/p/5353235.html 可以 note++打开 在格式里 选择utf-8 无bom格式编码 即可
- linux 下查看系统资源和负载,以及性能监控
1,查看磁盘 df -h 2,查看内存大小 free free [-m|g]按MB,GB显示内存 vmstat 3,查看cpu cat /proc/cpuinfo 只看 ...