Wednesday, August 31, 2011

Windows内核学习-2.3

环境子系统和子系统DLL(environment subsystems and subsystem DLLs):
OS/2, POSIX, Windows
OS/2
Windows 2000开始取消。
Windows XP
开始不包含POSIX,而是一个增强版本的POSIX
位于HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems
Windows
键值,Windows子系统专用文件
Kmode, Windows
子系统内核文件
OS/2, POSIX
键值,OS/2POSIX子系统文件。
环境子系统将Windows基本服务自己开放给应用程序,每个子系统提供对原生服务不同部分的访问。应用程序只能完成对应的唯一子系统下的功能,每个可执行文件只对应唯一的子系统,运行时有进程创建代码检查程序头中的子系统标示,该标示由链接是的/SUBSYSTEM指定。
不同子系统不能混合调用。
应用程序不直接调用Windows系统服务,而是通过子系统DLL来调用。
可以用Exetype工具或Dependency Walker工具检查应用程序工作的子系统。
当一个应用程序调用子系统DLL中的函数时,有以下三种情况之一:
  • 函数完全在子系统DLL中的用户模式下实现,不必向环境子系统进程传递消息,不会调用Windows系统服务
  • 函数需要对Windows执行体的调用,如ReadFileWriteFile
  • 函数需要环境子系统的参与
某些函数可能需要第二种与第三种的接合

POSIX
OS/2通过调用Windows子系统来显示I/O.
Windows子系统:
  • 环境子系统进程(csrss.exe)
    • 支持控制台(文本)窗口
    • 创建和删除进程/线程
    • 部分支持16位虚拟DOS
    • GetTempFile等函数,自然语言函数等
  • 内核模式设备驱动(Win32k.sys)
    • 窗口管理器
    • 图形设备接口(GDI)
  • 子系统DLL
    • Kernel32.dll, Advapi32.dll, User32.dll, Gdi32.dll等文档化的Windows API
    • 大部分未文档化的调用Ntoskrnl.exeWin32k.sys的内核模式系统服务
  • 图形设备驱动,硬件独立的图形显示驱动,打印驱动
应用程序通过调用标准用户函数建立用户接口控制,窗口管理器将这些请求传递给GDI
GDI
提供一组二维函数,使得应用程序与图形设备交互但不必关心设备本身。

Windows NT 4
以前,窗口管理器和图形服务是用户模式Windows子系统进程的一部分,但自NT4以后,被放入内核模式,提高了系统的性能。但与其他服务进程的切换消耗了CPU周期和内存资源。

USER
GDI放在内核模式下,其对性能和稳定性的影响已经减至最小,并不影响抢先式调动。因为在Windows中,在执行体任何地方执行的线程都会在用户模式下线程一起抢先和调度,而不像其他系统,内核模式的执行过程不会被抢占。
POSIX子系统:
Portable Operating System Interface based on Unix, Unix
风格操作系统接口的国际标准。
Windows
只实现了POSIX.1(ISO/IEC 9945-1:1990, IEEE POSIX stardard 1003.1-1990)
OS/2子系统:
仅支持OS/2 1.216位基于字符或者视频I/O的应用程序。
Ntdll.dll:
主要用于子系统DLL的系统支持库,包含两类函数:
  • 系统服务,从用户模式调用Windows执行体模块的接口。NtCreateFile.
  • 由其他子系统、子系统DLL、原生镜像使用的内部支持函数
Ntdll.dll对所有函数具有相同的入口点名,而在函数内部负责处理器体系结构相关的模式切换指令。
Ntdll.dll
还包含其他函数,如镜像载入,堆管理等。
执行体(Executive)
执行体是Ntoskrnl.exe的上层(kernel是下层),包含以下类型的函数:
  • 用户模式可导出和可调用的函数,称为系统服务,通过Ntdll.dll导出
  • 通过使用DeviceIoControl函数调用的设备驱动函数,提供从用户模式调用内核模式中不与读写相关的设备驱动函数
  • 只能从内核模式调用的函数.Windows DDK, Installable File System(IFS)中文档化的函数
  • 可以从内核模式调用但为在DDKIFS中文档化的函数
  • 定义为全局符号但未导出的函数,Ntoskrnl.exe内部调用。IopMi开头
  • 模块内部未定义为全局符号的函数
执行体包含以下主要组件:
  • Configuration Manager, 负责实现和管理系统注册表
  • Process and thread manager, 负责建立和终止进程、线程。在Windows内核中实现,执行体向这些低层对象添加了部分功能。
  • SRM(security reference manager), 强制本地安全策略
  • I/O manager, 实现了设备独立的I/O, 将任务转发至适当的设备进行后续处理
  • PnP(Plug and Play) manager,针对某一设备加载何种驱动,合理分配I/O端口,IRQDMA通道等硬件资源,当硬件设备改变时向系统发送适当的通知消息
  • Power manager,协调电源事件,想设备驱动发送电源管理,I/O通知
  • WDM Windows Management Instrument routines, 设备驱动可以发布性能和配置信息,并且从用户模式的WMI服务接受指令
  • Cache manager, 增强基于文件的I/O性能
  • Memory manager, 实现虚拟内存,支持cache manager
  • Logical prefetcher, 加速系统和进程的启动顺序
执行体还包含以上组件使用的若干函数
  • Object manager
  • LPC(local procedure call) facility
  • common run-time library
  • executive support routines
内核(kernel):
提供了执行体组件所需要的基本机制,如线程调度、服务同步等。主要由C编写,部分汇编,可以在DDK中查阅。Ke开头
内核对象(Kernel Object):内核对线程和其他可共享资源的包装,使得内核更加易于控制。
  • control object, 建立控制多种操作系统函数的原语
  • dispatcher object, 影响线程调度
硬件支持:
将执行体和设备驱动从Windows支持的多种体系结构中独立、抽象出来,如中断处理,异常发布,多处理器同步等。

No comments:

Post a Comment