Windows NT 内核分析
(文章整理 by sunsjw 2007 年 8 月 27 日 21 时 58 分 QQ:509207758)
由于我在看到这篇文章时已经没有了作者与译者的信息,抱歉一下,这的确是一篇好文,值
得转:
00.系统组件
01.Windows NT 操作系统的内存格局
02.Windows NT 与 FLAT模型
03.线程信息块(THREAD INFORMATION BLOCK)
04.进程控制域(PROCESSOR CONTROL REGION)
00.系统组件
=====================
实际上,所有的 Windows NT 组件其本身都是 DLL、PE格式的.EXE文件、导入导出函
数。Windows 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 位线性地址空间保存了供系统使用的程序。这种格局,地
址空间 80000000 - ffffffff 为系统组件:驱动程序、系统表、系统数据结构等等。系统内
存的精确格局是不可能得到的,但是通过其功能用途和大致位置可以区分出各个区域。
*80000000-9FFFFFFF
系统代码。在这里驻留的是 Hal和 ntoskrnl的代码和数据,还有驱动程序(boot 驱动和
加载 ntosldr 的驱动)。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 GlobalDescriptor Table),
(
由 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 用于内核(驱
动程序、系统代码)工作时的寻址。选择子 30 和 3b 分别指向 Kernel Process Region 和
Thread Information Block。当代码运行在 ring0 时,FS 寄存器的值为 30,如过运行在
ring3,则 FS 的值为 3b。选择子 30 总是指向基址为 FFDFF000 的描述符。选择子 3b指示
的基址则依赖于用户线程。选择子 48 定义了局部描述符表 LDT(LocalDescriptor Table)。
LDT只在 Virtual DOS machine(VDM)应用程序下使用。当运行该进程时,在处理器的
LDTR 寄存器中加载着相应的指针,否则,LDTR 的值为 0。LDT主要用在 Windows 3.x应
用程序下。Windows 3.x 应用程序运行在 WOW(Windows On Windows)下,而 WOW
则实现在 VDM进程里。VDM进程的 LDT使用上和 Win3.x 里的一样。在 GDT表里总会有两
个 TSS 类型的选择子。这是因为运行在 Intel处理器上的 Windows NT 操作系统没有使用基
于任务门的任务切换机制。IDT包含以下描述符(由 SoftIce'a 得到):
Int Type Sel:Offset Attributes Symbol/Owner
IDTbase=F8500FC8 Limit=07FF
0000 IntG32 0008:8013EC54 DPL=0 P _KiTrap00
...
0007 IntG32 0008:8013F968 DPL=0 P _KiTrap07
0008 TaskG 0050:00001338 DPL=0 P
0009 IntG32 0008:8013FCA8 DPL=0 P _KiTrap09
...
0012 IntG32 0008:80141148 DPL=0 P _KiTrap0F
...
001F IntG32 0008:80141148 DPL=0 P _KiTrap0F
0020 Reserved 0008:00000000 DPL=0 NP
...
0029 Reserved 0008:00000000 DPL=0 NP
002A IntG32 0008:8013E1A6 DPL=3 P _KiGetTickCount
002B IntG32 0008:8013E290 DPL=3 P _KiCallbackReturn
002C IntG32 0008:8013E3A0 DPL=3 P _KiSetLowWaitHighThread
002D IntG32 0008:8013EF5C DPL=3 P _KiDebugService
NT.rar_内核分析
版权申诉
142 浏览量
2022-09-24
00:51:55
上传
评论
收藏 28KB RAR 举报
Kinonoyomeo
- 粉丝: 74
- 资源: 1万+