Friday, May 3, 2013

windows架构综述

首先声明,本文并非原创,只是对大牛先辈们的文章的收集整理,如有错误,欢迎指正。另外,如无特别说明,本文的概念都适用于32位的windows xp和windows 2003(其他的我不知道)。

Ring3层:
即应用层,该层的应用程序使用各自的子系统进行编程,最核心的子系统是Win32子系统,其他子系统如Posix的API最终要转化为Win32 API;最值得一提的是Wow(windows on windows)子系统,该子系统是为了16位windows程序而设计(同理,该子系统下的程序最终转化为Win32调用)。

Win32 API主要分为三类:User函数(管理图形组件如窗体、菜单、按钮)、GDI函数(提供函数在物理设备上画图)、KERNEL函数(管理进程、文件和通信等)。不管哪类API,都要转化为Native API,(所有)Native API都定义在Ntdll.dll中。NativeAPI通过int 2e(或者sysenter)软中断进行系统调用, 它定义在Ring3,是进入Ring0的窗口。

系统调用会存放在两个表中,第一个是SSDT(KeServiceDescriptorTable),第二个是Shadow SSDT(KeServiceDescriptorTableShadow),前者实现KERNEL函数需要的功能(在ntoskrnl.exe、ntkrnlmp.exe(对称处理器)、ntkrnlpa.exe(物理地址扩展)或者ntkrpamp.exe中),后者实现User函数和GDI函数的功能(放在win32k.sys,后者应该是前者的超集)。Native API通常由Zw或者Nt开头,与系统调用的名字相同(Zw和Nt开头函数在r3(ntdll)中的定义是完全一致的,但在r0中,Nt开头的函数是真正的实现,Zw开头的函数通过SSDT调用其对应的Nt函数)。

Ring0层:
Ring0层分为执行体、内核和驱动程序。

执行体分为对象管理器、进程管理器、虚拟内存管理器、I/O管理器和配置管理器。
对象管理器管理Windows定义的某些数据结构的创建、管理和回收,这些结构中的某些成员可以被读写,相当于公有成员,其他的相当于私有成员,对象管理器提供例程来访问私有成员。
I/O管理器负责创建IRP(IO请求包),IRP由用户或者系统发起,由IO管理器创建,由驱动程序响应(当然,驱动也可以进一步创建IRP给更底层的驱动)。
配置管理器管理注册表。

和执行体相比,内核是非常小的,它主要提供如下功能:
线程调度
对多处理器同步
对中断、异常和陷阱响应

驱动程序用来操作设备。有些设备是虚拟出来的比如虚拟光驱设备,有些设备是真实设备派生出来的设备,比如卷设备,一个分区对应一个卷设备,所有对卷设备的操作由卷驱动最终转化为对磁盘驱动的请求。

No comments:

Post a Comment