Windows的体系结构
Windows体系结构是分层的模块系统,主要层次有硬件抽象层HAL、内核、执行体和大量的子系统集合。前面三个都运行在保护模式下,而各子系统都在用户模式下运行。子系统又可分为环境子系统和保护子系统,其中环境子系统仿真不同的操作系统,保护子系统提供安全功能。如图1-3所示。
执行体:动态链接库、系统进程、用户进程、服务进程
子系统:环境子系统、保护子系统
在处理器的存储保护中,主要有两种权限状态:
核心态(管态)
也被称为特权态,是操作系统内核所运行的模式,运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。
用户态(目态),指非特权状态。
在用户态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。在操作系统的设计中,用户态也类似,指非特权的执行状态。内核禁止用户态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。
1.内核-核心态
1)内核定义
内核是运行在核心态的一个程序,执行Windows操作系统最基本的操作。
内核代码短小紧凑,可移植性也很好。通常,除了中断服务例程,正在运行的线程是不能抢先内核的。
2)内核主要功能
线程调度陷入处理和异常调度中断处理和调度多处理器同步供执行体使用的基本内核对象。2.硬件抽象层 (HAL)-核心态
1)HAL定义
Windows操作系统设计的一个至关重要的方面就是在多种硬件平台上的可移植性,HAL就是关键。HAL是一个可加载的核心态模块HAL.dll
。
2)HAL功能
为运行在Windows系统上的硬件平台提供低级接口隐藏各种与硬件有关的细节,例如I/O接口、中断控制器一级多处理器通信机制等任何体系结构专用的和依赖于计算机平台的函数。3.执行体-用户态
动态链接库、系统进程、用户进程、服务进程?
1)Windows的执行体是NTOSKRNL.EXE
的上层(内核是其下层)。
2)执行体可以从用户态导出并且可以调用函数,这些函数的接口在NTDLL.DLL
中,通过Win32API
可以对它们进行访问。
4.系统进程和系统线程
1)系统进程
系统进程是一种只运行在核心态的“系统线程”宿主。
2)系统线程
具有一般用户态线程的所有属性和描述表,不同点在于它们仅运行在内核态,执行加载于系统空间中的代码。另外,系统线程没有用户进程地址空间,因此必须从系统内存堆中分配动态存储区。
系统线程只能从内核态调用。Windows系统一级不同的设备驱动程序在系统初始化时创建系统线程以执行那些需要线程描述表的操作,例如,发布和等待I/O或其他对象、轮询一个设备等。
系统线程与用户线程的区别
① 系统线程仅运行在核心态
② 系统线程必须从系统内存堆中分配动态存储区
③ 系统线程执行加载于系统空间中的代码
Windows工作原理
动态链接
Windows环境中运行的程序可以共享存储在所谓动态链接库(Dynamic-Link Libraries,DLL)文件中的例程。Windows提供了在运行时把程序和动态链接库中的例程链接起来的机制。其实Windows本身基本上就是一套动态链接程序库。
Windows工作原理的中心思想就是“动态链接”概念。Windows自身带有一大套函数,应用程序就是通过调用这些函数来实现它的用户界面和在屏幕上显示文本与图形的。这些函数都是在动态链接库里实现的。这些文件的名称都带有后缀.dll,或有时带有后缀.exe。在Windows 98中,这些文件通常放在\Windows\SYSTEM子目录下,而在Windows NT中,则放在\WINNT\SYSTEM和\WINNT\SYSTEM32子目录下。
早期 Windows 的大部分只是实现了3个动态链接库。它们分别代表了Windows 的3个主要的子系统,即内核(kernel)、用户(user)以及GDI。虽然新版 Windows中子系统增加了不少,但是通常Windows程序调用的大部分函数实际上仍然以这3个模块为主。
内核(在16位的KRNL386.exe及32位的KERNEL32.DLL中实现)负责操作系统的那些传统工作,包括内存管理、文件输入/输出及任务管理等。
用户(在16位的User.exe及 32位的User32.DLL中实现)指的是用户界面,负责所有的窗口管理。
GDI(在16位的GDI.exe及32位的GDI32.DLL中实现)就是图形设备接口,负责在屏幕或打印机上显示文本与图形。
Windows 98带有上千个函数以供应用程序调用。每个函数都有一个意义明确的名字,比如CreateWindow。不用猜,这个函数是帮程序建立窗口用的。应用程序可能调用的所有函数必须先要在头文件里声明。
在 Windows程序中,调用Windows 函数与调用C语言的库函数(如 Strlen),没什么两样。最主要的区别就是C语言库函数的机器代码会直接链接到你的程序代码中,而Windows函数则是放在你的程序之外的 DLL里。
当链接Windows程序以生成执行文件时,一定得链接你的编程环境所提供的特殊的“导入库”(import library)。这些导入库包含所有Windows函数调用要碰到的动态链接库的名字及引用信息。链接程序利用这些信息构建EXE 文件中的表格,当装入程序的时候,Windows要靠这些表格来解析Windows函数调用。
当Windows程序运行时,它通过一个叫做“动态链接”的进程与Windows接口。每个Windows 的exe文件包含它所要用的各个动态链接库以及库中的函数的引用地址。当一个Windows程序被装入内存之后,程序中的函数调用都被解析成dll函数入口的指针,同时这些被调用的函数也被装入内存(如果还没有在内存中的话)。
Windows历史
术语
GUI
图形用户界面(Graphical User Interface,):有时亦称为“虚界面”或“图形窗口环境”。
GDI
针对 Windows环境编写的程序用不着直接访问屏幕或打印机之类的图形显示硬件。Windows自己带有一种图形编程语言(叫做图形设备接口(Graphics Device Interface,GDI)),用来方便地显示图形和格式化文本。Windows把显示硬件虚拟化。这样只要配有合适的Windows设备驱动程序,针对Windows环境编写的程序就可以在任何显卡或打印机上运行。应用程序本身并不需要知道系统到底配备了什么类型的设备。
多任务:多个程序同时运行。
抢占式:用系统时钟把系统中正在运行的各个程序的处理时间分段。
多线程:一个进程有多个线程。
参考:
《Windows 程序设计 第5版》