Windows NT内核分析

Windows NT内核分析
2008-08-01 15:40
由于我在看到这篇文章时已经没有了作者与译者的信息,抱歉一下,这的确是一篇好文,值得转:

00.系统组件
01.Windows NT操作系统的内存格局
02.Windows NT与FLAT模型
03.线程信息块(THREAD INFORMATION BLOCK)
04.进程控制域(PROCESSOR CONTROL REGION)

00.系统组件
=====================

实际上,所有的Windows NT组件其本身都是DLL、PE格式的.EXE文件、导入导出函数。Windo
ws NT的主要组件有:

*Ntoskrnl.exe
系统核心。系统执行函数都集中于此,这些函数又会调用其它组件。核心组件有:对象管理
器、内存管理器、进线程创建、进线程控制、LPC、安全管理、异常处理、文件系统、输入输
出、VDM、和т.д.一般都位于大于80100000h的地址上。

*Hal.dll
硬件抽象层(Hardware Abstraction Layer)- 硬件相关的模块。该隔离层将操作系统中
硬件相关的部分隔离出来以增强系统的可移植性。主要的模块实现了非常底层的函数:程序
控制中断、硬件输入输出等等。一般位于大于80100000h的地址上。

*Ntdll.dll
实现某些Win32 API函数。提供了核心模式与用户模式之间的接口。位于用户空间。换句话说
,系统函数调用主要由这里导出。

*Kernel32.dll
实现了一些函数,类似于Win9x的核心。其中有很多的函数封装在ntdll.dll中。

*Csrss.exe
进程服务器子系统。其是一个单独的进程,因此受到保护以免受其它进程(位于其它进程的
地址空间中)影响。对服务的请求要借助于LPC产生。

*Win32k.sys
驱动程序。用以减少调用Csrss服务开销损失。在此程序中实现了GDI和USER函数。不用LPC而
用系统调用-这很明显提高了Windows NT4.0和2K的图形处理性能。

01.Windows NT Windows NT操作系统的内存格局
=============================

在Windows NT中高2G的32位线性地址空间保存了供系统使用的程序。这种格局,地址空间80
000000   -   ffffffff为系统组件:驱动程序、系统表、系统数据结构等等。系统内存的精
确格局是不可能得到的,但是通过其功能用途和大致位置可以区分出各个区域。

*80000000-9FFFFFFF
系统代码。在这里驻留的是Hal和ntoskrnl的代码和数据,还有驱动程序(boot驱动和加载n
tosldr的驱动)。GDT、IDT和TSS结构体同样驻留在这些区域中。

*C0000000-C0FFFFFF
系统表的区域。这个线性地址空间区域保存着进程的页表,页目录和其它与进程结构体有关
的东西。这个区域不是全局性的,不像其它的系统空间区域,而且对于于每一个进程来说会
映射到不同的物理空间,其保存着当前进程的数据结构。

*E1000000-E57FFFFF
分页池。这个区域可以换出到磁盘上。操作系统中的大多数对象都在这个区域中产生。实际
上一些内存池位于这个区域中。

*FB000000-FFDFEFFF
不可换出页的区域,即非分页区(Non Paged Poll)。这个区域中的数据永远不能换出到磁
盘上。这个区域中的数据总是系统必需的数据。例如,这里有进程与线程的信息块(Thread
environment block, Process Environment block)。

*FFDFF000-FFFFFFFF
PCR - Processor Control Region (进程控制域) 用于每一个进程。这个区域中保存着PCR
结构体。在此结构体中保存着系统状态的信息。例如,关于IRQL、当前线程、IDT等的信息。

低2G线性地址空间(00000000-0FFFFFFFF)为进程用户模式的地址空间(每个进程自己的空
间)。Win32地址空间看上去一般是下面这个样子:

*00000000-0000FFFF
保护区域。访问此区域会引发异常。被用于检测NULL指针。

*00xx0000
通常,应用程序加载在这样的地址上。

*70000000-78000000
Win32子系统的库通常映射到这里。

*7FFB0000-7FFD3FFF
代码页。

*7FFDE000-7FFDEFFF
用户模式的Thread Environment Block。

*7FFDF000-7FFDFFFF
用户模式的Process Environment Block。

*7FFE0000-7FFE0FFF

共享数据区。

*7FFFF000-7FFFFFFF
保护区域。

02.Windows NT与FLAT模型
===========================

自i286开始,在Intel的处理器里实现了四级保护机制,相应的就有四个特权级。代码与数据
能够拥有某级别的特权。这样,应用程序、系统程序、内核等等都运行在自己的特权级上,
而且不能随意访问比自己特权级高的代码和数据。实际上没有一个基于Intel处理器的操作系
统能用到所有的四个特权级(不为人知的那些不算在内)。Windows NT操作系统也不例外,
只用到了两个特权级(ring)。0级(最高特权级)下运行内核,3级(最低特权级)为用户
级。Intel处理器提供了强大的内存分段机制,其与特权级一起实现了直到段级的保护(例如
,程序的每一个逻辑段都可以由一个描述符表来描述)。但是Windows NT实现的是FLAT模型
。这就将选择子的使用降到了最低限度。处理器的全局描述符表GDT(Global Descriptor T
able),由Windows NT操作系统管理,其包含以下描述符(由SoftIce'a得到):

Sel. Type      Base      Limit     DPL Attributes
GDTbase=80036000 Limit=03FF
0008 Code32    00000000 FFFFFFFF 0    P   RE
0010 Data32    00000000 FFFFFFFF 0    P   RW
001B Code32    00000000 FFFFFFFF 3    P   RE
0023 Data32    00000000 FFFFFFFF 3    P   RW
0028 TSS32     8024D000 000020AB 0    P   B
0030 Data32    FFDFF000 00001FFF 0    P   RW
003B Data32    7FFD9000 00000FFF 3    P   RW
0043 Data16    00000400 0000FFFF 3    P   RW
0048 LDT       E1190000 000001FF 0    P
0050 TSS32     80149F60 00000068 0    P
0058 TSS32     80149FC8 00000068 0    P
0060 Data16    00022940 0000FFFF 0    P   RW
0068 Data16    000B8000 00003FFF 0    P   RW
0070 Data16    FFFF7000 000003FF 0    P   RW
0078 Code16    80400000 0000FFFF 0    P   RE
0080 Data16    80400000 0000FFFF 0    P   RW
0088 Data16    00000000 00000000 0    P   RW
0090 Reserved 00000000 00000000 0    NP
...
00E0 Reserved 00008003 00006100 0    NP
00E8 Data16    00000000 0000FFFF 0    P   RW
00F0 Code16    80117DB0 0000028D 0    P   EO
00F8 Data16    00000000 0000FFFF 0    P   RW
0100 Reserved 00008003 00006108 0    NP
...
03F8 Reserved 00000000 00000000 0    NP

前四个选择子全都位于线性地址空间。而且前两个选择子的描述符特权级DPL(Descriptor
Privilege Level)等于0,而后面两个的都是3。选择子8和10由用户应用程序使用。在FLAT
模型下,应用程序本身并不关心段寄存器的内容。在ring3工作时,CS、DS、SS寄存器总是分
别为值8、10、10。这样,系统代码就可以监视段寄存器的值。选择子1b和23用于内核(

Tags:

发表评论