大话操作系统之运行机制

运行机制

什么是机器指令?
能够让CPU直接识别,执行的指令就是机器指令。因为CPU只认识0和1,所以机器指令是由)01组成的指令集。

程序代码怎样转化成机器指令的?
程序代码是通过编译器,进过一下四个步骤形成最终二进制可执行文件:

  1. 预处理:程序经过CPP预处理器,删除注释,删除define,展开宏定义,添加行号,文件名标识等一些列操作,形成一个.i文件。
  2. 编译:把预处理完成的.i文件,进行词法分析、语法分析、语义分析以及优化后产生汇编代码文件.asm。
  3. 汇编: 编译器把汇编代码转化为CPU可以执行的二进制机器指令模块.o文件。
  4. 链接:程序代码的各个引用模块是独立地编译的,将各模块“组装”起来,这个过程就是链接,链接形成最后的CPU可执行文件。(例如windows下的.exe文件)

所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务。

机器指令的分类
操作系统将机器指令分为,特权指令(不允许用户程序使用指令),和非特权指令。
CPU作为计算机的大脑,用执行机器指令的方式支配计算机内/外部设备。一些非常危险的指令是不允许用户直接使用的,如内存清零指令。
为了在不同的情况下运行分别运行两种指令,操作系统又把CPU分为两种状态:用户态(此时cpu只能执行非特权指令)和核心态(特权和非特权指令都可以执行)。

操作系统内核

CPU用户态下运行应用程序。
CPU内核态下运行内核程序。

应用程序完成一次完整的设备调用的步奏:

  1. 应用程序首先,利用操作系统提供的库函数,进行系统调用(执行陷入指令),请求操作系统的内核服务,CPU从用户态切换到内核态。
  2. 内核程序,调用用硬件驱动程序操作硬件设备,完成以后利用中断处理程序,将CPU内核态再切回用户态。

内核程序

内核是计算机上配置的底层软件,是操作系统最基本,最核心的部分。实现操作系统内核功能的那些程序就是内核程序。

内核程序功能主要包括两个方面

  • 系统调度管理:时钟管理,中断处理,原语。
  • 系统资源管理,进程管理,内存管理,存储管理,设备管理。

原语:是一种特殊的程序,其执行具有原子性(设备驱动,CPU切换),要么不执行,要么一次性执行完毕中间不能中断。类似宏的概念。

中断和异常

CPU用户态核心态是怎样切换实现的呢?答案是中断
由于操作系统管理工作,比如进程切换,分配I/O设备等,都需要特权指令,因此CPU需要从用户态转为核心态,中断可以使CPU从用户态切换为内核态,使操作系统获得计算机的控制权。

中断分类
中断可以分为内中断和外中断两种类型。

  • 内中断:应用程序进行系统调用,硬件故障(比如内存缺页),软件故障(比如整数除0)等引起的中断。
  • 外中断:比如I/O设备完成,发出的中断信号,用户强行kill一个进程。

按照中断信号来源于区分

  • CPU内部,与当前指令执行相关的就是内中断,
  • 来自于CPU外部,与当前指令执行无关的就是外中断。

一个完整外中断处理步骤:

  1. CPU在用户态下,依次执行机器指令,每次执行完一个指令以后,CPU都要检查是否有外部中断信号。
  2. 如果检测到外部中断信号,在从用户态切换到核心态之前,需要保护被中断进程运行的上下文环境。
  3. 根据中断信号,转入相应操作系统中断处理程序,处理中断,CPU从用户态切换到核心态执行系统调用。
  4. 完成处理以后,需要恢复中断进程的CPU环境,运行现场。然后从核心态转到用户态,切回原来进程继续往下执行。

系统调用

操作系统作为用户和计算机硬件之间的中间层,需要向上层的用户应用程序提供一些简单易用的服务接口;主要包括命令接口和程序接口。
用户可以直接通过终端(terminal)输入命令(cd,cat,netstat,ps,df等 ),直接完成系统调用;还可以通过编写应用程序调用操作系统提供的程序接口(open(…),write(…)),完成系统调用。
在这里插入图片描述

“系统调用” 是操作系统提供给应用程序使用的一组接口,是一种可供应用程序调用的特殊函数;应用程序可以发出系统调用请求来获得操作系统的服务。计算机中的各种共享资源都由操作系统统一管理,用户程序想要操作系统资源,例如文件管理,必须通过系统调用的方式向操作系统发出服务请求,由操作系统代为完成。保证系统的稳定和安全性,防止用户非法操作。

需要注意的是操作系统提供的系统调用,并不是我们通常编写程序时所使用的库函数。为了降低编程的复杂度,现代高级语言一般会把相应的系统调用封装成库函数,方便程序员使用。
在这里插入图片描述
应用程序执行一个系统调用的完整步骤:

  1. 传递系统调用参数,例如write(参数)
  2. 执行陷入指令,中断操作(CPU从用户态向核心态切换)
  3. CPU进入核心态, 执行系统调用相应的服务程序
  4. 执行完毕,中断,从核心态向用户态切换,返回用户程序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章