Windows操作系统的体系结构、运行环境和运行状态

本文由IT界的老兵荔园微风分享,深入探讨了Windows操作系统的体系结构,包括模块组合结构、层次结构和微内核结构,并重点阐述了核心态和用户态的概念,以及系统调用的过程。文章还触及了中断、异常和系统控制的数据结构在操作系统中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。说Windows操作系统的运行环境和运行状态,首先要介绍一下Windows操作系统的体系结构,然后再要说到最重要的两个概念:核心态与用户态。

操作系统的体系结构就是操作系统的组成结构。操作系统的体系结构主要包括模块组合结构、层次结构和微内核结构。下面来具体看看这三种,但我们这里不介绍宏内核和纵向结构内核。

  

模块组合结构

模块组合结构是软件工程出现以前的早期操作系统以及目前一些小型操作系统的体系结构。操作系统是一个有多种功能的系统程序,可以看作一个整体模块,也可以看作若干个模块按一定的结构方式组成的。系统中的每一个模块都是根据要完成的功能来划分的,这些功能模块按照一定的结构方式组合起来,协同完成整个系统的功能。优点是结构紧密、接口简单直接、系统的效率相对较高。缺点是首先这种结构的模块之间可以随意转接,各模块相互牵连,不容易把握好模块的独立性,导致系统结构不清晰。其次这种结构的可扩展性较差。在更换一个模块或修改一个模块时,要先弄清模块间的接口,如果要按当初设计的模块接口来设计新的模块,而当初设计的模块接口很可能是随意约定的,那么要做这项工作就存在一定难度。最后这种结构系统的可适应性差。随着系统规模的不断增大,采用这种结构构造的系统的复杂性会迅速增长,所以它只适用于系统小、模块少、使用环境比较稳定的系统。

层次结构

要弥补模块组合结构中模块间调用存在的不足之处,就必须改善模块间毫无规则的相互调用、相互依赖的关系,尤其要清除模块间的循环调用。层次结构的设计就是从这一点出发,力求使模块之间调用的无序性变为有序,减少了模块调用的无规则性。按层次结构来设计操作系统,就是将操作系统的所有功能模块按功能的调用次序排列成若干层,使得功能模块之间只存在单向调用和单向依赖。优点是模块间的组织和依赖关系清晰明了,上层功能是建立在下层功能基础之上的,系统的可读性、可适应性以及可靠性都得到了增强。此外,对某一层进行修改或替换时,最多只影响到邻近的两层,便于修改和扩充。缺点是操作系统的各个功能模块应该放在哪一层,如何有效地进行分层是必须要考虑的问题。为了增强其适应性,必须把与机器特点紧密相关的软件(如中断处理、输入/输出管理等)放在最底层;其次,要将最常用的操作方式放在最内层,而把随着这些操作方式改变的部分放在外层。另外,当前操作系统的设计都是基于进程的概念,通常要将为进程提供服务的系统调用模块放在系统的内层。

微内核结构

随着网络技术的普遍应用和发展,很有必要为用户提供一个符合处理分布式信息的分布式系统环境。因此,操作系统可以采用微内核结构。微内核的主要思想是:在操作系统内核中只留下一些最基本的功能,而将其他服务尽可能地从内核中分离出去,用若干个运行在用户态下的进程(即服务器进程)来实现,形成所谓的“客户/服务器”模式,即C/S模式。普通用户进程(即客户进程)可通过内核向服务器进程发送请求,以取得操作系统的服务。从微内核结构的主要思想可以看出,它非常适用于分布式系统。优点是首先每个服务进程运行在独立的用户进程中,即便某个服务器失败或产生问题,也不会引起系统其他服务器和其他组成部分的崩溃,可靠性好;其次系统具有很好的灵活性,只要接口规范,操作系统可以方便地增删服务功能;再次便于维护,即修改服务器的代码不会影响系统其他部分;最后这种结构的操作系统适合分布式处理的计算环境。缺点是这种结构的操作系统效率不高,因为所有用户进程都要通过微内核相互通信,所以微内核本身就成了系统的“瓶颈”,尤其是通信频繁的系统。

Windows操作系统以微内核结构起家,融合了宏内核的优点,形成了混合内核的特点,所以Windows操作系统是混合内核。由于本文是说Windows操作系统,不是介绍Linux操作系统,我们这里也就不介绍宏内核了,大家可以到优快云上搜索宏内核的文章看。我们这里也没有介绍云计算和虚拟化,所以纵向结构内核(外内核)也不介绍了,纵向结构内核可能会在未来几年在云计算上发挥重要作用,本质上来说,纵向结构内核不同于宏内核和微内核的地方就在于,应用程序可以直接访问纵向结构内核资源。

Windows操作系统可以运行在多种环境下,通常包括传统环境(Windows PC等常见环境)、网络环境(分布式操作系统等)、嵌入式环境(Windows手机操作系统、家用电器的操作系统等)。这些属于操作系统的硬件环境,此外还有人机接口和操作系统与其他软件的关系。为了避免Windows操作系统及其关键数据(如PCB等)受到用户程序有意或无意的破坏,通常将处理器的执行状态分为两种:核心态与用户态。

核心态。核心态又称管态、系统态,是操作系统管理程序执行时机器所处的状态。注意,是机器当时所处的状态,不是程序所处的状态,这点要注意。它具有较高的特权,能执行包括特权指令的一切指令,能访问所有寄存器和存储区。

用户态。用户态又称目态,是用户程序执行时机器所处的状态,注意,是机器当时所处的状态,不是程序所处的状态,这点要注意。是具有较低特权的执行状态,它只能执行规定的指令,只能访问指定的寄存器和存储区。

划分核心态与用户态之后,这两类状态的相关程序以及各自的存储空间被严格区分了,而且在CPU执行时有着完全不同的待遇。用户态程序不能直接调用核心态程序,而是通过执行访问核心态的命令,引起中断,由中断系统转入操作系统内的相应程序,例如,在系统调用时,将由用户态转换到核心态。

特权指令:只能由操作系统内核部分使用,不允许用户直接使用的指令,如I/O指令、设置中断屏蔽指令、清内存指令、存储保护指令和设置时钟指令。

Windows操作系统中一些与硬件关联较紧密的模块(如时钟管理、中断处理、设备驱动等)以及运行频率较高的程序(如进程管理、存储器管理、设备管理等)构成了Windows操作系统的内核。内核的指令操作工作在核心态,主要包括以下4个方面的内容。

1)时钟管理。时钟是计算机的各部件中最关键的设备,Windows操作系统通过时钟管理,向用户提供标准的系统时间。另外通过时钟中断的管理,可以实现进程的切换,如时间片轮转调度。

2)中断机制。键盘或鼠标的输入、进程的管理和调度、系统功能的调用、设备驱动、文件访问等,无不依赖于中断机制。中断机制中,只有一小部分属于内核,负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少终端的处理时间,提高系统的并行处理能力。

3)原语。计算机进程的控制通常由原语完成。所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断。在Windows操作系统中,某些被进程调用的操作,如队列操作、对信号量的操作、检查启动外设操作等,一旦开始执行,就不能被中断,否则就会出现操作错误,造成系统混乱。所以,这些操作都要用原语来实现。原语是操作系统核心(不是由进程,而是由一组程序模块组成)的一个组成部分,并且常驻内存,通常在管态下执行。原语一旦开始执行,就要连续执行完,不允许中断。处于操作系统最底层,是最接近硬件的部分。这些程序的运行时间较短,调用频繁。原语是在操作系统中调用核心层子程序的指令。与一般广义指令的区别在于它是不可中断的,而且总是作为一个基本单位出现。它与一般过程的区别在于:它们是“原子操作(primitive or atomic action)”。所谓原子操作,是指一个操作中的所有动作要么全做,要么全不做。换言之,它是一个不可分割的基本单位,因此,在执行过程中不允许被中断。原子操作在管态下执行,常驻内存。原语的作用是为了实现进程的通信和控制,系统对进程的控制如不使用原语,就会造成其状态的不确定性,从而达不到进程控制的目的。

4)系统控制的数据结构及处理。Windows操作系统中需要一些用来登记状态信息的数据结构,如作业控制块、进程控制块、设备控制块、各类链表、消息队列、缓冲器、空闲登记区、内存分配表等。除此之外还应该定义对这些数据结构的一系列操作:进程管理、存储器管理、设备管理。

这里要补充说明一下Windows操作系统的中断与异常。中断与异常是一对类似但又有区别的概念。中断,也称外中断,是系统正常功能的一部分,例如,因进程调度使系统停止当前运行的进程转而执行其他进程,或者因缺少所需资源而中断当前操作等待资源到达,在系统处理完其他事情之后,会继续执行中断前的进程。异常,也称内中断,是由错误引起的,如文件损坏、进程越界等。通常异常会引起中断,而中断未必是由异常引起的。

最后说一下Windows操作系统的系统调用。

系统调用是Windows操作系统提供的用户接口之一,是由Windows操作系统实现的所有系统调用所构成的集合,即程序接口或应用编程接口(Application Programming Interface,API),是应用程序同系统之间的接口。

Windows操作系统的主要功能是为应用程序的运行创建良好的环境。为了达到这个目的,内核提供了一系列具备预定功能的内核函数,通过一组称为系统调用(System Call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的内核函数完成所需的处理,并将处理结果返回给应用程序。如果没有系统调用和内核函数,用户将不能编写大型应用程序。Windows操作系统提供的系统调用通常包括进程控制、文件系统控制(文件读写操作和文件系统操作)、系统控制、内存管理、网络管理、socket控制、用户管理以及进程间通信(信号、消息、管道、信号量和共享内存)。

Windows操作系统执行系统调用的流程如下面两图所示。用户需要执行系统调用时,首先准备并传递系统调用所需的参数,通过陷入(trap)指令进入操作系统的系统内核,此时将从用户态进入内核态;之后执行相应的系统调用函数,使用特定的系统内核功能;最后将处理结果返回给用户进程,此时将从内核态返回用户态。

操作系统执行系统调用的流程画法一:

操作系统执行系统调用的流程画法二:

操作系统执行系统调用的流程画法三:

操作系统执行系统调用的流程画法四:

操作系统执行系统调用的流程画法五:

这种五种画法我认为都是很经典的,究竟哪一种更适合你理解,仁者见仁。大家可以选择一种画法去理解。我个人认为第三种画法画得最好。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

[编辑本段]Turbo C2.0    介绍      Turbo C2.0不仅是一个快捷、高效的编译程序,同时还有一个易学、易用的集成开发环境。使用Turbo C2.0无需独立地编辑、编译和连接程序,就能建立并运行C语言程序。因为这些功能都组合在Turbo 2.0的集成开发环境内,并且可以通过一个简单的主屏幕使用这些功能。    基本配置要求   Turbo C 2.0可运行于IBM-PC系列微机,包括XT,AT及IBM 兼容机。此时要求DOS2.0或更高版本支持,并至少需要448K的RAM,可在任何彩、单色80列监视器上运行。支持数学协处理器芯片,也可进行浮点仿真,这将加快程序的执行。 [编辑本段]Turbo C 2.0的主要文件的简单介绍   INSTALL.EXE 安装程序文件   TC.EXE 集成编译   TCINST.EXE 集成开发环境的配置设置程序   TCHELP.TCH 帮助文件   THELP.COM 读取TCHELP.TCH的驻留程序README 关于Turbo C的信息文件   TCCONFIG.EXE 配置文件转换程序MAKE.EXE   项目管理工具TCC.EXE   命令行编译TLINK.EXE   Turbo C系列连接器TLIB.EXE   Turbo C系列库管理工具C0?.OBJ 不   同模式启动代码C?.LIB   不同模式运行库GRAPHICS.LIB   图形库EMU.LIB   8087仿真库FP87.LIB 8087库   *.H Turbo C头文件   *.BGI 不同显示器图形驱动程序   *.C Turbo C例行程序(源文件)   其中:上面的?分别为:T Tiny(微型模式)S Small(小模式)C Compact(紧凑模式)M Medium(中型模式)L Large(大模式)H Huge(巨大模式)    Turbo C++ 3.0   “Turbo C++ 3.0”软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计 的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计的程序文件。 [编辑本段]C 语言   C语言起始于1968年发表的CPL语言,它的许多重要思想都来自于Martin Richards在1969年研制的BCPL语言,以及以BCPL语言为基础的与Ken Thompson在1970年研制的B语言。Ken Thompson用B语言写了第一个UNIX操作系统。M.M.Ritchie1972年在B语言的基础上研制了C语言,并用C语言写成了第一个在PDP-11计算机上研制的UNIX操作系统。1977年出现了独立于极其的C语言编译文本《看移植C语言编译程序》,从而大大简化了把C语言编译程序移植到新环境中所做的工作,这本身也就使UNIX的日益广泛使用,C语言也迅速得到推广。   1983年美国国家标准化协会(ANSI)根据C语言问世以来的各种版本,对C语言的发展和扩充制定了新的标准,成为ANSI C。1987年ANSI又公布了新标准————87ANSI C。   目前在微型计算机上使用的有Microsoft C、Quick C、Turbo C等多种版本。这些不同的C语言版本,基本部分是相同的,但是在有关规定上有略有差异。   C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C 语言加上一些汇编语言子程序, 就更能显示C 语言的优势了,象PC- DOS ,WORDSTAR等就是用这种方法编写的。归纳起来C 语言具有下列特点:   1. C是中级语言   它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。   2. C是结构式语言   结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。   3. C语言功能齐全   C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大, 可以实现决策目的。   4. C语言适用范围大   C 语言还有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。   C语言的优点很多,但是也存在一些缺点,如运算优先级太多,运算能力方面不像其它高级语言那样强,语法定义不严格等。但是这些都不能阻止C语言成为一门广受欢迎的计算机编程语言
Turbo C2.0 介绍   Turbo C2.0不仅是一个快捷、高效的编译程序,同时还有一个易学、易用的集成开发环境。使用Turbo C2.0无需独立地编辑、编译和连接程序,就能建立并运行C语言程序。因为这些功能都组合在Turbo 2.0的集成开发环境内,并且可以通过一个简单的主屏幕使用这些功能。 基本配置要求   Turbo C 2.0可运行于IBM-PC系列微机,包括XT,AT及IBM 兼容机。此时要求DOS2.0或更高版本支持,并至少需要448K的RAM,可在任何彩、单色80列监视器上运行。支持数学协处理器芯片,也可进行浮点仿真,这将加快程序的执行。 主要文件的简单介绍   INSTALL.EXE 安装程序文件   TC.EXE 集成编译   TCINST.EXE 集成开发环境的配置设置程序   TCHELP.TCH 帮助文件   THELP.COM 读取TCHELP.TCH的驻留程序README 关于Turbo C的信息文件   TCCONFIG.EXE 配置文件转换程序MAKE.EXE   项目管理工具TCC.EXE   命令行编译TLINK.EXE   Turbo C系列连接器TLIB.EXE   Turbo C系列库管理工具C0?.OBJ 不   同模式启动代码C?.LIB   不同模式运行库GRAPHICS.LIB   图形库EMU.LIB   8087仿真库FP87.LIB 8087库   *.H Turbo C头文件   *.BGI 不同显示器图形驱动程序   *.C Turbo C例行程序(源文件)   其中:上面的?分别为:T Tiny(微型模式)S Small(小模式)C Compact(紧凑模式)M Medium(中型模式)L Large(大模式)H Huge(巨大模式)
### 回答1: 在 TURBO C 2.0 中,您可以使用 biosdisk() 函数来格式化软盘。 下面是一段代码示例: ``` #include <stdio.h> #include <dos.h> int main() { // 定义扇区的大小 unsigned int sector_size[3] = {512, 512, 1024}; // 定义填充字节 unsigned char fill_char[3] = {0xF6, 0xF6, 0x48}; // 格式化磁道 700 的前三个扇区 for (int i = 0; i < 3; i++) { int result = biosdisk(2, 0, 70, 0, i + 1, 1, sector_size[i], fill_char[i]); if (result != 0) { printf("格式化扇区 %d 失败,返回码: %d\n", i + 1, result); } } return 0; } ``` 请注意,在使用 biosdisk() 函数之前,需要包含 dos.h 头文件。 希望这能帮到您! ### 回答2使用TURBO C 2.0语言,可以通过以下代码格式化软盘的70磁道0面,并分别格式化3个扇区,大小分别为512字节、512字节和1024字节。其中,前两个扇区使用F6填充,第三个扇区使用48填充。 ```c #include<stdlib.h> #include<stdio.h> #include<dos.h> void formatFloppyDisk(){ union REGS regs; regs.h.ah = 0x0;// To format a floppy disk, we set AH=0 regs.h.dl = 0;// Drive number (0=A, 1=B, etc.) regs.x.cx = 0;// Track number to format regs.h.dh = 0;// Head number regs.h.al = 0;// Sector size (0=default, 1=512 bytes, 2=1024 bytes, 3=2048 bytes etc.) int FILL_BYTE = 0;// The byte value to fill the sectors with during formatting int NUM_SECTORS = 3;// Number of sectors to format // To format 70th track 0th head regs.x.ax = 0x1301; // 0x13 = Reset disk system, 01H = Reset only specified drive int86(0x13, &regs, &regs); // BIOS interrupt to reset disk system for (int i=0; i<NUM_SECTORS; i++){ regs.x.ax = 0x3101; // 0x31 = Write Format, 01H = Format only current track regs.x.bx = 0x0001; // 0x00 = Drive A:, 01H = Head 1, 0 = Generate ID Field depending on the disk in the drive 1 = Keep the ID Field all zeros regs.x.cx = 0x0170; // Track number=70(0-79 range) regs.h.dh = 0x00; // Head number=0 or 1 regs.h.al = 0x02; // Control byte=always zero regs.x.dx = i+1; // Sector number starting from 1 regs.x.si = 0x0000; // segment and offset of read/write buffer regs.x.di = 0x0000; // segment and offset of result if(i == 2){ FILL_BYTE = 0x48; // Fill the third sector with 48 regs.x.ax = 0x3102; // 0x31 = Write Format, 02H = Format sequential tracks immediately following the one being formatted }else{ FILL_BYTE = 0xF6; // Fill the first two sectors with F6 } regs.h.ah = FILL_BYTE; // Fill the sector with specified byte int86(0x13, &regs, &regs); // BIOS interrupt to format the specified sector } } int main(){ formatFloppyDisk(); return 0; } ``` 上述代码使用了INT 0x13,即BIOS中断服务例程,来执行软盘格式化操作。通过设置寄存器的不同参数,可以指定要格式化的磁道、面、扇区大小和填充字节。在这个例子中,我们格式化了软盘70磁道0面的3个扇区,前两个扇区使用F6填充,第三个扇区使用48填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值