windows总体结构的关键系统组件,如下图,它并没有显示各种驱动程序的的层次。
windows结构简图
用户模式和内核模式用线分割开来,上方代表用户模式进程,线下组件代是内核模式的操作系统服务。用户模式的线程在一个受保护的进程地址空间中执行(当它们在内核模式执行时,可访问系统空间)。因此,系统支持进程,服务进程,用户应用程序,环境子系统都有各自的私有进程地址空间。
四种基本的用户模式的进程简要描述如下:
系统支持进程:固定的(或硬件指定的)系统支持进程,如登录和会话管理器,并不是windows的服务,他们不是由服务控制管理器来启动的。
服务进程:服务进程宿纳的是windows服务,服务的运行通常要独立于用户登录。许多windows服务器应用,如sql server也包含了一些以windows服务方式来运行的组件。
用户应用程序:有6种类型,windows 32位,windows 64位,windows3.1 16位,ms-dos 16位,posix 32位或os/2 32位。
环境子系统:实现了操作系统环境的支持部分,这里的环境指操作系统展示给用户或程序员的个性化部分。windows nt最初有3个环境子系统,windows、posix、os/2,windows xp以后基本的产品中只有windows子系统随产品发布。
在windows下,用户程序并不直接调用原始的windows操作系统服务,相反,他们通过一个或多个子系统动态链接库(DLLs)来发起调用。子系统DLL的角色是,将一个文档化的函数转化为一些恰当的内部(通常未文档化)windows系统服务调用。这个转化过程可能会——也可能不会——向正在为用户应用程序提供服务的环境子系统进程发送一个消息。
内核模式组件包含下列部分:
windows执行体:包含基本的操作系统服务,如内存管理、进程线程管理、安全性、I/O、网络和跨进程通信。
windows内核:由一组低层次的操作系统功能构成,如线程调度,中断和异常分发,以及多处理器同步。他也提供了一组例程和基本对象,执行体的其余部分利用这些例程和对象实现更高层次的功能。
设备驱动程序:既包括硬件设备驱动程序,也包括文件系统和网络驱动程序。其中,硬件设备驱动程序将用户的I/O函数调用转换为特定的硬件设备I/O请求。
硬件抽象层:是一层特殊的代码,把内核、设备驱动程序、windows执行体的其余部分,跟与平台相关的硬件差异隔离开来。
窗口和图形系统:实现了图形用户界面函数,比如对窗口的处理,用户界面控件,以及绘制等。
下图列出系统核心组件文件名:
可移植性(支持多种硬件体系结构和平台)
两种方法实现可移植性:
第一,windows分层设计,系统低层部分是与处理器体系结构相关,或与平台相关,这些部分被隔离到独立的模块中,所以系统的高层部分可以不考虑体系结构之间的差别,也不用关心硬件平台的差异。两个关键组件为系统提供了可移植性,他们是内核和硬件抽象层。与体系结构相关的功能在内核中实现,如线程环境切换;在同一体系结构中,不同系统间有差异的功能则在硬件抽象层实现,比如不同的主板。
第二,windows绝大部分代码用C编写,少部分是C++。只有那些需要直接与系统硬件通信的部分(中断陷阱处理器),或者对性能极度敏感的操作系统部分(环境切换),才使用汇编语言编写。不仅在内核和硬件抽象层有汇编代码,而且在系统其他核心部分也有汇编代码,如实现了互锁指令的例程,以及本地调用设施中的一个模块。既可能在windows子系统内核模式部分,也可能在某些用户模式库中,如ntdll.dll中的进程启动代码。
对称多处理器
多任务是指在多个执行线程之间共享同一个处理器的操作系统技术。当计算机拥有多个处理器的时候,她可以同时执行多个线程。因此,单处理器操作系统只不过是看起来好像同时执行多个线程,但多处理器系统可以真正做到同一时刻处理多个线程,每个处理器上执行一个线程。
windows是一个对称多处理操作系统,在这些处理器中没有主次之分,系统和用户线程可以被调度到任何一个处理器上运行,且所有处理器共享同一内存地址空间。
而非对称多处理器系统中,系统选择其中一个处理器来运行操作系统内核代码,而其他处理器只运行用户代码,如下图。
对称与非对称的比较
所支持的处理器数目取决于windows版本,不同版本内核或硬件抽象层文件有差异。安装的时候,安装程序将正确的文件选择出来,拷贝到本地的"\windows\system32"目录中。为确定哪些文件应该被拷贝,可参见文件"\windows\repair\setup.log",他列出了所有要被拷贝到本地系统磁盘的文件,以及将他们从发布介质上拷贝到哪个目录中。
可伸缩性
多处理器的一个关键问题是可伸缩性。多处理器系统中,竞争资源和其他性能问题比在单处理器系统中复杂得多,必须在系统设计的时候考虑清楚。windows集以下几个特性于一身,对其成功起到至关重要作用。
● 能在任一个可用的处理器上运行操作系统代码,也可以同时在多个处理器上运行系统代码;
● 在单个进程内执行多个线程,这些线程可以在不同处理器上并行执行;
● 内核内部以及设备驱动程序和服务器进程内部的细粒度同步,使得多个组件可以在多个处理器上并行执行;
● 诸如I/O完成端口之类的编程机制,使得可以实现高效的多线程服务器进程,并且这样的程序在多处理器系统上有很好的伸缩性。
并且,windows的可伸缩性在不断进步,以适应更多变化。
疑问,系统编码用C/C++/汇编,那么在被引导入内存之前通过什么手段将系统代码编译为二进制机器码?