概述
第二章:Windows系统架构
上图就是windows系统架构
- 环境子系统和子系统DLL:
环境子系统扮演的角色就是把Windows执行体系统服务的某些子集暴露给应用程序。
这就是说,一个子系统对应着一类程序进行操作,有些应用程序可能能运行在一个子系统上,但是不能运行在另一个上面。
每个exe文件都会在链接的时候确定好子系统了。比如VC++链接的时候。Subsystem就是子系统
子系统DLL:应用程序不能直接调用系统调用,需要通过子系统dll,也就是Kernrl32.dll这些dll
- ntdll.dll:
Ntdll是一个特殊的系统支持库,主要被子系统DLL和原生应用程序使用(原生应用程序是指子系统为Native,没有绑定任何子系统)。Ntdll里面包含以下两种函数
- 可调用Windows执行体系统服务的调度存根
- 被子系统、子系统dll使用的内部支持函数
这个是进入内核模式(syscall)
- 执行体:
Windows执行体是NtOsKrnl.exe的上层,NtOskrnl下层是内核。这两层功能,存储的东西各不一样。
执行体包含以下函数:
- 系统服务(用户模式下调用的,通过API)
- 通过DeviceIoControl调用的设备驱动程序函数
- 只能在内核模式调用的函数(Ex..开头的)
执行体是包含了很多组件的。
主要是以下组件:
配置管理器、进程管理器、IO管理器、即插即用管理器、Windows驱动程序模型、内存管理器,对象管理器等等。
同时,执行体还支持四组函数:对象的(内核提供数据结构,放给执行体来操作),异步,运行库函数,执行体提供的例程(比如内存分配).
- 内核:
内核就是NtOsKrnl.exe下层用于提供基础机制的函数+数据结构组成的。
比如执行体使用的线程调度和同步服务。Ke开头的函数
内核主要包括两大部分:
- 内核对象
内核对象是一种明确定义,可预知操作系统底层原语和机制,可以供执行体高层组件执行自己的操作。内核和执行体实现了其他部分的分离,所有策略给执行体执行,除了线程调度这些底层的。
对象分为控制对象和分发器对象。
其实就是简而言之,内核提供,给执行体操作的。
- 内核处理器控制块和内核处理器控制区
KPCR:内核处理器控制区
这个是内核使用的,和处理器有关的数据结构。
比如里面保存着IDT TSS GDT 在32位 内核模式下fs:[0]指向KCPR
在x64下,gs:[0]指向KCPR;
KPCB:内核处理器控制块
这个是保存在KPCR的里面的。主要作用是DPC+线程调用作用。
- HAL(抽象硬件层)
HAL由一个dll组成,hal.DLL,一言以蔽之,就是这个dll可以屏蔽不同硬件架构的差异,从高层看,提供了一些接口,不依赖于硬件,可以供驱动或者内核操作,从而进行操作硬件。
这也是Windows之中最接近硬件的一个模块了。
- 设备驱动对象:
这也就是我们常说的驱动加载的地方,驱动是可以装载的内核模块。一般使用三种上下文来运行:
- 发起IO请求的用户线程上下文
- 在内核模式系统线程上下文(即插即用)
- 做为中断的结果
驱动并不直接操作硬件,而是使用HAL提供的屏蔽了硬件差异的接口。从而驱动具备了良好的移植性。
设备驱动一般包含下面这几大类:
硬件设备驱动,文件系统驱动,文件系统过滤驱动,软件驱动。
-
- Windows驱动模型:
也就是大名鼎鼎的WDM,从WDM来看,驱动可以分为三类
PDO:总线驱动,没什么用,位于设备栈的最底层
FDO:功能驱动,这个是驱动真正实现功能的地方,为相应设备提供接口。
FiDO:过滤器驱动,在FDO上下都有,PDO之上,用于拦截或者修改IO请求。
- 系统进程:
Windows10都会包含以下系统进程
IDLE:CPU空闲时候用这做事情(CPU有几个,IDLE就有几个线程)
System:里面包含大量的PID TID(PID TID其实也是一个句柄,只不过位于全局句柄之中;)
最后
以上就是唠叨凉面为你收集整理的Windows系统架构(winddows内核学习)的全部内容,希望文章能够帮你解决Windows系统架构(winddows内核学习)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复