《Windows DIY》第一章: 概述
操作系统(英文:Operating System,缩写:OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。[1]
1.1什么是操作系统
1.1.1没有操作系统的时代
在介绍什么是操作系统前,先来看一下没有操作系统时的情形。
假如我们希望从硬盘上读取一个文件(路径已经指定),首先要通过查分区表和文件表得到文件所在扇区,然后控制硬盘去访问指定的扇区将数据读取到内存,当然这些表也在硬盘中,首先得按照文件系统的约定去操作硬盘读取相应扇区以访问这些表。这一过程繁琐而又无聊,并且带来了许多不必要的麻烦:首先程序员需要了解各种硬件是如何工作的,还要编写代码去控制它们,另外,不是所有硬件都像硬盘那样遵循一定的标准,这种情况下等于在一定程度上软件"绑架"了硬件--程序只能在符合自己要求的硬件上工作。
没有操作系统的时候,计算机通常处于被软件“霸占”的状态:一个程序占据着计算机的所有资源,如果想要执行另外的程序,除非两个程序间存在事先约定好的接口,不然只能由人工操作。这在几十年前计算机十分昂贵仅用于特定任务并有专人维护时并无大碍。但在计算机已经微型化的今天是完全不可想象的。
1.1.2操作系统的任务和功能
在上一章中,我们已经看到了缺乏操作系统时的困境。在没有操作系统的时候,所有软件都必须和硬件直接打交道,这导致了一系列的问题。因此,人们设计了一种叫操作系统的软件,由它负责管理各类硬件,使得其它程序从这些繁重的任务中解脱出来(这时程序运行在操作系统上,只要程序符合操作系统的规范即可正常运行,无需过于在意硬件)。后来,操作系统的功能逐渐拓展,拥有了任务调度功能,可以管理运行在操作系统中的程序,最终实现“多任务”(多个程同时在一个操作系统上运行)。
对于现代的PC或者服务器上的操作系统,通常具备以下任务和功能:
A.硬件管理:
a1内存管理
a2中断管理
a3外部设备(声卡、显卡、网卡、硬盘等“不属于cpu本身的硬件资源,通常通过驱动程序扩展)
B.任务管理
b1任务调度
C.系统调用(将涉及底层硬件交由操作系统实现的功能通过系统调用的形式提供给第三方应用程序使用
1.2Windows NT
Windows是目前主流的PC和中小型服务器操作系统,市场占有率超过95%,自从Windows XP之后,PC与服务器版本均基于Windows NT内核。内核是操作系统的核心组件,负责实现操作系统最核心的功能。Windows NT 提供了上一节所述的全部功能,以及一套图像用户界面(GUI),一套文件系统(FS),其将任务抽象为进程和线程来管理,并且提供了一套应用程序编程接口(API,其本质就是系统调用)供应用程序使用。
更重要的是,Windows利用处理器的权限管理、虚拟内存实现了一套安全机制,以实现对单一应用程序的控制,使其无法直接控制硬件或是干扰其它程序的运行。
上个世纪,Microsoft Windows NT被定义为服务器和工作站使用的系统,而PC使用的系统则为基于DOS演化而来的另一个系列(大家熟悉的Windows 95、98皆属于此)。进入21世纪后,两个系列合二为一。大多数熟知的Windows版本和“NT版本号”对应关系如下:
版本 版本号 发布时间
Windows XP 5.1 2001年
Windows Server 2003 5.2 2003年
Windows Vista/Server 2008 6.0 2006年/2008年
Windows 7/Server2008R2 6.1 2009年
Windows 8/Server2012 6.2 2012年
Windows 8.1/Server2012R2 6.3 2013年
1.3Windows NT的系统架构
这一节简单介绍Windows NT的系统架构和组成,其基本架构如图【1-1】所示:
【图1-1】
从图中不难看出,Windows NT系统首先可以被分为两部分:工作在用户层的一系列dll和工作在内核层的系统内核以及其它组件。前者向用户应用程序提供了一套统一的文档化的应用程序编程接口(API)来调用系统功能,其运行在CPU的非特权模式下(无法执行特权指令)。后者则工作在CPU的特权模式下(可以执行特权指令)。
从整个系统来看,系统内核(ntoskrnl.exe,内核的映象名会随CPU与电源管理模式不同而有所变化)是整个操作系统的神经中枢。顾名思义,系统内核负责实现整个系统中各种请求与资源的管理,并且在某些方面直接管理着硬件(主要是CPU和内存),所有来自用户层的请求都将经过内核的处理后,直接返回或者转发给其它组件。
硬件抽象层(hal.dll)负责将一些硬件“抽象地”提供给内核,以屏蔽不同硬件间的差异,它也会直接控制某些硬件。
大部分与硬件相关的管理工作则由设备驱动程序完成,设备驱动程序在工作的时候与内核的设备管理器(未列出)协同,Windows NT实现了一套设备驱动程序编程框架和模型,并且提供了大量与基础硬件相关的设备驱动程序。
Windows子系统(win32k.sys)则作为内核的一个附加模块,负责实现Windows中的图形化用户界面(GUI)和相关功能。
在内核层之上,则是一系列的系统DLL(动态链接库),其中最“底层”的是ntdll.dll和user32.dll,它们的任务是直接将请求通过系统服务调用-分发机制传递给内核,其中后者只是负责实现和GUI相关的功能。这两个DLL通过导出函数的形式向外界提供了一系列的功能,但是这些函数是未文档化的,被称为Native API(原生API),未文档化的意思即为这些API不可在编程时直接调用(未在Windows SDK的头文件中定义),并且无法保证这些API不会随着系统的变化而发生改变。
最后位于最上层的是user32.dll和comctl32.dll,它们向用户应用程序提供统一的编程接口(API),当然这些API是文档化的,前者提供的是那些基础的API(如内存管理、文件管理),后者则和GUI相关。
(ps:其实这些DLL间的调用关系比图中更加复杂,并且为了简化逻辑这里还省略了gid32.dll)。
通过本节可以了解到,当一个用户应用程序调用API请求系统为其实现某个功能后,首先它们根据功能需求调用了native api,natibe api将请求转发给系统内核,系统内核则负责将请求直接完成或交给某个内核中的组件去实现。
通过这套机制,应用程序无法直接控制硬件,并且在请求的路径上会经过多次安全检查,这是Windows NT系统安全的基石。
另外,并不是所有的API都会最终通过Native API调用内核中的功能,当这个API只需要返回位于用户进程空间内存中的某些数据时,它就不会这样做。
引用:
1.中文维基百科:操作系统
http://zh.wikipedia.org/zh-cn/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F