Microsoft Windows Internals, 4th Edition
读前感:
作者Mark Russinovich和David Solomon无疑是两位顶级牛人,前者通过reverse engineering对windows内核有深入了解,后者是windows内核培训师,此书自然非常值得一读,也是工作的需要。
好像一直以来对版本号都比较在意。以前总是喜欢记各种数字,分类,级别之类的东西。
Product Name, Internal Version Number
Windows NT 3.1, 3.1
Windows NT 3.5, 3.5
Windows NT 3.51, 3.51gi
Windows NT 4.0, 4.0
Windows 2000, 5.0
Windwos XP, 5.1
Windows Server 2003, 5.2
Windows Vista, Server 2008, 6.0
更详细的可以参考转载的另一篇文章。
其实从NT问世以来,核心代码的变化就不大了,相对于95等基于DOS的Windows,其改进主要有以下几个方面:
支持多处理器系统
支持访问权限控制等安全性
完全32位系统,无16位代码
完全多任务
允许16位程序在各自的地址空间运行
只有映射了相同共享内存区段的进程,其共享内存相互可见
95下部分关键操作系统页在用户模式下可写,使得系统和应用程序容易崩溃
Windows API包含以下几个主要部分:
Base Services
Component Services
User Interface Services
Graphics and Multimedia Services
Messaging and Collaboration
Networking
Web Services
.NET Framework的概念:
一组类库的集合,FCL(Framework Class Library)和CLR(Common Language Runtime)。
提供托管代码(managed code)执行环境和即时调试(just-in-time debug, JIT debug),类型验证、垃圾收集、代码访问安全性等特性。
所有.NET Framework的组件都是在非托管Windows API函数基础上实现的标准用户模式Windows DLL。
.NET Framework各组件间的关系:
Windows API 函数:文档化的、Windows API中可调用的例程。CreateProcess
Native system services(executive system services): 非文档化、用户模式下可调用的服务。NtCreateProcess
Kernel support functions (or routines):只能在内核模式中调用的Windows操作系统子例程。ExAllocatePool
Windows services:由Windows控制管理器启动的进程。Task Scheduler
DLL:在应用程序使用时动态载入的一组可调用子例程的集合。
Process(进程):
执行程序实例时包含资源集合的一个容器。Program(程序)是指一组指令的集合。抽象化的windows进程包含:
私有地址空间
可执行程序
一组指向各种系统资源的句柄
access token(security context),标示了用户、安全组、与进程相关的优先级
process ID (client ID),唯一
至少一个执行线程
Windows只保留 创建者进程创建者的ID,而不保留父进程和和孙子进程之间的链接。
对于这点,我的理解是,如果A进程创建了B进程,B进程又创建了C进程。此时若结束A的进程树,由于A与C之间无链接,故C进程不会结束,而A进程和B进程会结束。
Thread(线程):
Windows在进程内用于调度执行的入口,包含:
CPU状态寄存器内容
用于kernel mode的栈和user mode的栈
TLS(thread-local storage): 私有存储控件,由子系统、运行时库、DLL使用
thread ID,唯一,不会与process ID重复
可拥有自己的security context
Fiber:
允许应用程序调度自己的线程而不依赖Windows基于优先级的调度机制,也称为轻量级线程。在kernel32.dll中在用户模式下实现,对内核可见。
使用fiber:
使用windows函数"ConvertThreadFiber"将线程转换为fiber;
使用"CreateFiber"函数,新转换的fiber可以建立附加的fiber,每个fiber可以拥有自己的fiber集合。
与线程不同,只有手动使用"SwitchToFiber",或者当前fiber结束,新的fiber才开始执行。
进程中的所有线程共享进程的虚拟地址空间及其他资源,可以读取/写入其他线程的内存。然而,除非进程使其部分私有地址空间成为共享内存区(shared memory section, Windows API的文件映射对象file mapping object),或者进程有权限打开其他进程以使用"ReadProcessMemory"等进程交叉内存函数(cross-process memory function),否则线程在其他情况下无法引用非所属进程的地址空间。
Access Token: 位于进程对象内部,描述security context,包含进程的security identification和credentials。线程默认没有access token,但是线程个体可以在不影响进程中其他线程的情况下拥有一个模拟其他进程(包括远程进程)security context的access token。
VAD(virtual address descriptor): 内存管理单元用来跟踪进程正在使用的虚拟地址的数据结构。
Job: 进程模型的扩展,使得一组进程可以作为一个单元进行管理和操作,弥补windows中缺少的结构化的进程树。
Virtual Memory:Windows实现了基于扁平/线性地址空间的虚拟内存系统,使得每个进程都可以拥有各自较大的私有地址控件。可以使物理上不连续的内存被映射到连续区域,在运行时由内存管理单元及其他硬件进行翻译和映射。通过保护和映射,操作系统可以保证私有地址控件相互独立,不会冲突或者覆盖。由于大部分系统的物理内存比正在使用的进程需要的虚拟内存少很多,因此内存管理单元会将一部分内存作为分页文件存储在磁盘上。当线程访问已经转储到磁盘分页上的虚拟地址空间时,虚拟内存管理单元再将这些信息重新回载到物理内存。此部分工作由内存管理单元及相应的硬件完成,应用程序不必关心具体细节。
系统虚拟内存大小与硬件平台有关。32位x86系统的虚拟地址空间理论最大值默认4GB,其中0x00000000~0x7fffffff分配给应用程序,0x80000000~0xffffffff分配给操作系统自身使用。Windows 2000 Advanced Server, Windows 2000 DataCenter Server, Windows XP(sp2 or later), Windows Server 2003支持在boot.ini中加入"/3GB"和"/USERVA",来使得特殊标记的应用程序(必须在可执行镜像头中设置大地址空间标记aware flag)可以使用3GB的私有地址空间,其余1GB留给操作系统使用。
AWE(address windowing extension): windwos允许32位应用程序分配最多64GB物理内存,然后将其映射至2GB虚拟地址空间。通过PAE实现。
x64: 8192GB User Process space, 6657GB System space
Itanium: 7152GB User Process space, 6144GB System space
该限制并非平台体系结构的限制,而是当前64位windows实现的限制。
Kernel Mode vs. User Mode:
Windows使用了两种处理器模式,处理器本身可能支持更多模式。
user mode: 应用程序代码
kernel mode: 操作系统代码,有访问所有系统内存及CPU指令的权限。
通过提供给操作系统及系统软件更高的优先级,windows可以保证应用程序的崩溃不影响系统的整体稳定性。
Intel x86体系结构定义了四种优先级/环。Windows使用Ring 0给内核模式,Ring 3给用户模式。只使用两种优先级的原因是受较老的体系结构的影响(Compaq Alpha, Silicon Graphics MIPS)只实现两两种优先级。
Kernel mode 的系统代码和设备驱动共享同意虚拟地址空间。虚拟内存的每一页标记了处理器应该以何种方式访问该页。系统空间页只能以kernel mode访问,用户空间的所有页都可以从user mode访问。只读页在任何模式下都不可写入。
windows不会对运行在kernel mode的组件所使用的私有读写系统内存进行保护。一旦出在kernel mode下,操作系统及设备驱动即具有了对系统内存空间的完全访问权限。这种保护上的缺陷使得加载第三方设备驱动时要格外注意,同时也是windows引入驱动签名机制和驱动验证机制的原因。
应用程序通过使用系统服务来调用从user mode转换到kernel mode,模式转换不影响线程调度顺序。
Privilege Time: 指在一个特定时间间隔内运行在kernel mode的时间。
User Time: 指在一个特定时间间隔内运行在user mode的时间。
Terminal Service:远程用户可建立至另一台机器的会话并且运行应用程序。服务器将图形界面传回客户端,同时将远程用户的输入指令传给服务器。Unix下的X Windows允许应用程序在服务器上运行而显示在客户端,因为整个用户会话都是远程的,而不仅是单一的应用程序。
Windows 2000 Server允许建立远程会话,Windows 2000 Professional不可。
Windows XP Professional只允许建立一个远程会话,即同一会话同一时刻只允许本地或远程之一登陆。
Windows XP支持快速用户切换。
Windows 2000 Server和Windows Server 2003 Standard Edition同时允许两个远程连接。
可以通过Windows API来限制和控制应用程序的远程执行。
Object: 静态定义对象类型的单一运行时实例。
Handle: 对象实例的引用。
Security:
discretionary protection: 对象拥有者授予/拒绝他人访问
privilege access control: 若拥有者不可用,控制某使用者是否有使用权
Registry: 保存用于维护系统、设备、设置、安全及用户配置的数据结构
Unicode:大部分有字符串参数的内核函数均以16位unicode来存储和处理,为保持和ANSI的兼容性,有字符串参数的函数都会有ANSI(以A标示)和Unicode(以W标示)两个版本的函数接口。
常用工具:
www.sysinternals.com
Startup Programs Viewer
DLL List
EFS Information Dumper
File Monitor
Handle Viewer
Junction Tool
Live Kernel Debugging
Logon Sessions
Object Viewer
Pending File Moves
PipeList Tool
Process Explorer
Get SID Tool
Registry Monitor
TDImon
Support Tools, Platform SDK, Windows DDK, Resource Kits:
Dependency Walker
Global Flags
Kernel Debuggers
Open Handles
Page Fault Monitor
Pool Monitor
Process Statistics
Process Viewer
Quick Slice
Service Control
Task (Process) List
Windows built-in tools:
Performance tool
Task Manager
SoftICE
作者Mark Russinovich和David Solomon无疑是两位顶级牛人,前者通过reverse engineering对windows内核有深入了解,后者是windows内核培训师,此书自然非常值得一读,也是工作的需要。
好像一直以来对版本号都比较在意。以前总是喜欢记各种数字,分类,级别之类的东西。
Product Name, Internal Version Number
Windows NT 3.1, 3.1
Windows NT 3.5, 3.5
Windows NT 3.51, 3.51gi
Windows NT 4.0, 4.0
Windows 2000, 5.0
Windwos XP, 5.1
Windows Server 2003, 5.2
Windows Vista, Server 2008, 6.0
更详细的可以参考转载的另一篇文章。
其实从NT问世以来,核心代码的变化就不大了,相对于95等基于DOS的Windows,其改进主要有以下几个方面:
支持多处理器系统
支持访问权限控制等安全性
完全32位系统,无16位代码
完全多任务
允许16位程序在各自的地址空间运行
只有映射了相同共享内存区段的进程,其共享内存相互可见
95下部分关键操作系统页在用户模式下可写,使得系统和应用程序容易崩溃
Windows API包含以下几个主要部分:
Base Services
Component Services
User Interface Services
Graphics and Multimedia Services
Messaging and Collaboration
Networking
Web Services
.NET Framework的概念:
一组类库的集合,FCL(Framework Class Library)和CLR(Common Language Runtime)。
提供托管代码(managed code)执行环境和即时调试(just-in-time debug, JIT debug),类型验证、垃圾收集、代码访问安全性等特性。
所有.NET Framework的组件都是在非托管Windows API函数基础上实现的标准用户模式Windows DLL。
.NET Framework各组件间的关系:
Windows API 函数:文档化的、Windows API中可调用的例程。CreateProcess
Native system services(executive system services): 非文档化、用户模式下可调用的服务。NtCreateProcess
Kernel support functions (or routines):只能在内核模式中调用的Windows操作系统子例程。ExAllocatePool
Windows services:由Windows控制管理器启动的进程。Task Scheduler
DLL:在应用程序使用时动态载入的一组可调用子例程的集合。
Process(进程):
执行程序实例时包含资源集合的一个容器。Program(程序)是指一组指令的集合。抽象化的windows进程包含:
私有地址空间
可执行程序
一组指向各种系统资源的句柄
access token(security context),标示了用户、安全组、与进程相关的优先级
process ID (client ID),唯一
至少一个执行线程
Windows只保留 创建者进程创建者的ID,而不保留父进程和和孙子进程之间的链接。
对于这点,我的理解是,如果A进程创建了B进程,B进程又创建了C进程。此时若结束A的进程树,由于A与C之间无链接,故C进程不会结束,而A进程和B进程会结束。
Thread(线程):
Windows在进程内用于调度执行的入口,包含:
CPU状态寄存器内容
用于kernel mode的栈和user mode的栈
TLS(thread-local storage): 私有存储控件,由子系统、运行时库、DLL使用
thread ID,唯一,不会与process ID重复
可拥有自己的security context
Fiber:
允许应用程序调度自己的线程而不依赖Windows基于优先级的调度机制,也称为轻量级线程。在kernel32.dll中在用户模式下实现,对内核可见。
使用fiber:
使用windows函数"ConvertThreadFiber"将线程转换为fiber;
使用"CreateFiber"函数,新转换的fiber可以建立附加的fiber,每个fiber可以拥有自己的fiber集合。
与线程不同,只有手动使用"SwitchToFiber",或者当前fiber结束,新的fiber才开始执行。
进程中的所有线程共享进程的虚拟地址空间及其他资源,可以读取/写入其他线程的内存。然而,除非进程使其部分私有地址空间成为共享内存区(shared memory section, Windows API的文件映射对象file mapping object),或者进程有权限打开其他进程以使用"ReadProcessMemory"等进程交叉内存函数(cross-process memory function),否则线程在其他情况下无法引用非所属进程的地址空间。
Access Token: 位于进程对象内部,描述security context,包含进程的security identification和credentials。线程默认没有access token,但是线程个体可以在不影响进程中其他线程的情况下拥有一个模拟其他进程(包括远程进程)security context的access token。
VAD(virtual address descriptor): 内存管理单元用来跟踪进程正在使用的虚拟地址的数据结构。
Job: 进程模型的扩展,使得一组进程可以作为一个单元进行管理和操作,弥补windows中缺少的结构化的进程树。
Virtual Memory:Windows实现了基于扁平/线性地址空间的虚拟内存系统,使得每个进程都可以拥有各自较大的私有地址控件。可以使物理上不连续的内存被映射到连续区域,在运行时由内存管理单元及其他硬件进行翻译和映射。通过保护和映射,操作系统可以保证私有地址控件相互独立,不会冲突或者覆盖。由于大部分系统的物理内存比正在使用的进程需要的虚拟内存少很多,因此内存管理单元会将一部分内存作为分页文件存储在磁盘上。当线程访问已经转储到磁盘分页上的虚拟地址空间时,虚拟内存管理单元再将这些信息重新回载到物理内存。此部分工作由内存管理单元及相应的硬件完成,应用程序不必关心具体细节。
系统虚拟内存大小与硬件平台有关。32位x86系统的虚拟地址空间理论最大值默认4GB,其中0x00000000~0x7fffffff分配给应用程序,0x80000000~0xffffffff分配给操作系统自身使用。Windows 2000 Advanced Server, Windows 2000 DataCenter Server, Windows XP(sp2 or later), Windows Server 2003支持在boot.ini中加入"/3GB"和"/USERVA",来使得特殊标记的应用程序(必须在可执行镜像头中设置大地址空间标记aware flag)可以使用3GB的私有地址空间,其余1GB留给操作系统使用。
AWE(address windowing extension): windwos允许32位应用程序分配最多64GB物理内存,然后将其映射至2GB虚拟地址空间。通过PAE实现。
x64: 8192GB User Process space, 6657GB System space
Itanium: 7152GB User Process space, 6144GB System space
该限制并非平台体系结构的限制,而是当前64位windows实现的限制。
Kernel Mode vs. User Mode:
Windows使用了两种处理器模式,处理器本身可能支持更多模式。
user mode: 应用程序代码
kernel mode: 操作系统代码,有访问所有系统内存及CPU指令的权限。
通过提供给操作系统及系统软件更高的优先级,windows可以保证应用程序的崩溃不影响系统的整体稳定性。
Intel x86体系结构定义了四种优先级/环。Windows使用Ring 0给内核模式,Ring 3给用户模式。只使用两种优先级的原因是受较老的体系结构的影响(Compaq Alpha, Silicon Graphics MIPS)只实现两两种优先级。
Kernel mode 的系统代码和设备驱动共享同意虚拟地址空间。虚拟内存的每一页标记了处理器应该以何种方式访问该页。系统空间页只能以kernel mode访问,用户空间的所有页都可以从user mode访问。只读页在任何模式下都不可写入。
windows不会对运行在kernel mode的组件所使用的私有读写系统内存进行保护。一旦出在kernel mode下,操作系统及设备驱动即具有了对系统内存空间的完全访问权限。这种保护上的缺陷使得加载第三方设备驱动时要格外注意,同时也是windows引入驱动签名机制和驱动验证机制的原因。
应用程序通过使用系统服务来调用从user mode转换到kernel mode,模式转换不影响线程调度顺序。
Privilege Time: 指在一个特定时间间隔内运行在kernel mode的时间。
User Time: 指在一个特定时间间隔内运行在user mode的时间。
Terminal Service:远程用户可建立至另一台机器的会话并且运行应用程序。服务器将图形界面传回客户端,同时将远程用户的输入指令传给服务器。Unix下的X Windows允许应用程序在服务器上运行而显示在客户端,因为整个用户会话都是远程的,而不仅是单一的应用程序。
Windows 2000 Server允许建立远程会话,Windows 2000 Professional不可。
Windows XP Professional只允许建立一个远程会话,即同一会话同一时刻只允许本地或远程之一登陆。
Windows XP支持快速用户切换。
Windows 2000 Server和Windows Server 2003 Standard Edition同时允许两个远程连接。
可以通过Windows API来限制和控制应用程序的远程执行。
Object: 静态定义对象类型的单一运行时实例。
Handle: 对象实例的引用。
Security:
discretionary protection: 对象拥有者授予/拒绝他人访问
privilege access control: 若拥有者不可用,控制某使用者是否有使用权
Registry: 保存用于维护系统、设备、设置、安全及用户配置的数据结构
Unicode:大部分有字符串参数的内核函数均以16位unicode来存储和处理,为保持和ANSI的兼容性,有字符串参数的函数都会有ANSI(以A标示)和Unicode(以W标示)两个版本的函数接口。
常用工具:
www.sysinternals.com
Startup Programs Viewer
DLL List
EFS Information Dumper
File Monitor
Handle Viewer
Junction Tool
Live Kernel Debugging
Logon Sessions
Object Viewer
Pending File Moves
PipeList Tool
Process Explorer
Get SID Tool
Registry Monitor
TDImon
Support Tools, Platform SDK, Windows DDK, Resource Kits:
Dependency Walker
Global Flags
Kernel Debuggers
Open Handles
Page Fault Monitor
Pool Monitor
Process Statistics
Process Viewer
Quick Slice
Service Control
Task (Process) List
Windows built-in tools:
Performance tool
Task Manager
SoftICE
No comments:
Post a Comment