现代操作系统的基本结构

操作系统本身属于软件的范畴,但是它需要紧密地跟硬件打交道,它为上层应用软件或应用系统提供了一层抽象,专门负责硬件资源的管理和分配。应用软件不需要直接跟硬件打交道,它们利用操作系统提供的功能来实现各种应用任务,如果它们要访问硬件,则必须通过操作系统提供的抽象接口来完成。在系统服务层之上,应用软件通过一层接口来调用系统提供的服务,而应用程序之间则保持相对隔离,它们相互间的通信需要通过系统来完成。操作系统提供一些基本的IPC(进程间通信)原语来支持上层应用程序之间的交互操作。系统内核负责管理这些应用程序,把有限的计算资源分配给它们,使它们的任务得以完成。

windows10 架构 win10底层架构_应用程序

硬件设备,例如键盘、显示器、磁盘、打印机和网络等等,则通过各自的驱动程序,以一致的方式由操作系统来处理。系统内核接受应用程序的请求,与硬件设备进行通信;另一方面,硬件设备向计算机发送信号,驱动程序收到信号后,与系统内核一起把信号传递给恰当的应用程序。对于通用的操作系统,为众多外部设备提供支持是系统执行环境的一个重要方面。

Windows系统结构

Windows基本结构。Windows采用了双模式结构来保护操作系统本身,以避免被应用程序的错误所波及。操作系统核心运行在内核模式下,应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块(内核驱动程序)所提供的服务时,应用程序通过硬件指令从用户模式切换到内核模式中;当系统内核完成了所请求的服务以后,控制权又回到用户模式代码。

 

windows10 架构 win10底层架构_Windows_02

在window中,用户代码和内核代码有各自的运行环境,而且它们可以访问的内存空间也并不相同。在32位系统中,内核代码可以访问当前进程的整个4GB虚拟地址空间,而用户代码只能访问底端的2GB虚拟地址(或3GB,如果打开了内核启动开关的/3GB的话)。

Windows子系统是Windows系统中一个不可缺少的组成部分,它与系统内核一起构成了用户应用程序的执行环境。Windows子系统既有内核模式部分(图形和窗口管理),也有用户模式部分。用户模式部分包括一个单独的子系统进程和一组链接到各个应用进程中的系统DLL。

Windows内核结构

Windows内核分为三层,与硬件直接打交道的这一层称为硬件抽象层(Hardware Abstraction Layer,简称HAL),这一层的用意是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中,从而使上面的层次可能做到独立于硬件平台。HAL之上时内核层,有时候也称为微内核,这一层包含了基本的操作系统原语和功能,如线程和进程、线程调度、中断和异常的处理、同步对象和各种同步机制。在内核层之上则是执行体(executive)层,这一层的目的是提供一些可供上层应用程序或内核驱动程序直接调用的功能和语义。Windows内核的执行体包含一个对象管理器,用于一直地管理执行体中的对象。执行体层和内核层位于同一个二进制模块中,即内核基本模块,其名称为ntoskrnl.exe。

内核层和执行体层的分工是,内核层实现操作系统的基本机制,而所有的策略决定则留个执行体。执行体中的对象绝大多数封装了一个或者多个内核对象,并且通过某种方式(比如对象句柄)暴露给应用程序。这种设计体现了机制与策略分离的思想。

windows10 架构 win10底层架构_子系统_03

应用程序通过一组系统DLL,最终通过ntdll.dll切换到内核模式下的执行体API函数中,以调用内核中的系统服务。Ntdll.dll是连接用户模式代码和内核模式系统服务的桥梁。对于内核提供的每一个系统服务,该DLL都提供一个相应的存根函数,这些存根函数的名称以“Nt”作为前缀,例如 NtCreateProcess、NtOpenFile和NtSetTimer。另外,ntdll.dll还提供了许多系统级的支持函数,比如映像加载器函数(以"Ldr"为前缀)、Windows子系统进程通信函数(以“Csr”为前缀)、调试函数(以“Dbg”为前缀)、系统事件函数(以“Etw”为前缀),以及一般的运行支持函数(以“Rtl”为前缀)和字符串支持函数等。

执行体API函数接收的参数都来自于各种应用程序、因此,为了确保系统的健壮性,以及抵抗来自用户模式的恶意攻击,所有执行体API函数必须保证参数的有效性。