问题:“指令”和我们平时所说的“代码”有什么区别?
平时我们使用C语言编写代码之后,这些代码会经过一些处理“翻译”为机器语言指令(一条高级语言的代码翻译过来可能会对应多条指令);
机器语言指令是由二进制数字表示的,因为计算机只能识别二进制数;
简单来说,“指令”就是处理器(CPU)能识别、执行的最基本命令;
指令就是让处理器(CPU)做一件具体的事情,有的指令,例如“加减乘除”,处理器在执行这些指令时并不会影响系统的安全性;但是有些指令会导致很大的安全问题,比如内存清零指令,如果所有的用户程序都可以使用这些指令,那就意味着一个用户可以将其它用户的内存数据随意清零,这样做显然是很危险的。
为了解决不同指令可能带来的安全问题,我们会把指令分为:
其中特权指令是不允许用户程序使用,CPU在执行指令时会进行判断,当前是否允许执行特权指令;
由此引出一个新的问题,CPU如何判断当前是否可以执行特权指令?为此规定了处理器的两种状态:
CPU的两种处理器状态是用程序状态字寄存器(PSW)中的某标志位来表示当前处理器处于什么状态。如0为用户态,1为核心态;
系统中存在特权指令和非特权指令两种,有的程序需要使用特权指令,有的指令只能使用非特权指令;因此计算机系统又把程序分为两种程序:
操作系统的内核程序时系统的管理者,即可以执行特权指令,也可以执行非特权指令,运行在核心态;
为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态;
上面聊了特征指令和非特征指令,特权指令需要运行在核心态的处理器中,非特权指令既可以在核心态的处理器中运行,也可以在用户态的处理器中运行;
需要使用特权指令的程序称为内核程序,普通的程序称为应用程序;内核程序需要使用特权指令,因此需要运行在核心态;
现在考虑下一个问题:操作系统中的哪些功能应该由内核程序实现呢?这就引出了操作系统的内核;
我们安装完windows操作系统之后,会发现操作系统提供了多种多样的功能,比如“记事本”、“任务管理器”。然而,这些功能不是必不可少的,即使没有任务管理器,我们仍然可以使用计算机;
操作系统是基于应用程序和裸机(纯硬件)的中间层次,但是操作系统还可以划分为更细小的层次;
比如最接近硬件的层次就是操作系统的内核,这是操作系统中最重要最核心的部分;在内核上还可以细分一层非内核功能;
操作系统的内核可以进一步细分为和硬件紧密相关的,比如说时钟管理、中断处理还有原语;
其中时钟管理用于实现计时功能,所有的进程切换、进程调度等工作都需要计时功能才能实现;原语是一种特殊的程序。比如设备驱动、CPU切换这些都需要原语实现,原语是最接近硬件的部分,这种程序的运行具有原子性,原子性是指这种程序要么不执行,要么一开始执行就得执行到结束,中间不能中断;
除了离硬件最近的时钟管理、中断处理、原语这三个模块之外,内核中通常还包含着像进程管理、存储器管理、设备管理等功能,这部分也属于内核功能;
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分;实现操作系统内核功能的那些程序就是内核程序;
操作系统的内核可以划分为四大部分:
上述四大部分中的时钟管理、中断处理、原语是最接近硬件的模块;原语有一个很重要的特性,原语的运行具有原子性,其运行只能一气呵成,不可中断;
操作系统内核中对系统资源进行管理的功能看,比如进程管理、存储器管理、设备管理也会被划分到操作系统内核;但是有的操作系统不把这部分功能归为“内核功能”。也就是说,不同的操作系统,对内核的功能划分可能并不一样;
因为不同操作系统的划分原则可能不同,由此引出了操作系统的体系结构:大内核和微内核。
大内核是把操作系统中的进程管理、存储器管理、设备管理等功能放到操作系统的内核中,这样的操作系统比较大,这就是大内核的体系结构;
如果操作系统的内核只包含最基本的功能,如时钟管理、中断处理、原语等,这种内核称为微内核;
大内核就是将操作系统的主要功能模块都作为系统内核,运行在核心态;微内核只是把最基本的功能保留在内核,把一些不必要的功能放在内核之外;
内核就是企业的管理层,负责一些重要的工作,只有管理层才能执行特权指令,普通员工只能执行非特权指令。用户态、核心态之间的切换相当于普通员工和管理层之间的工作交接
大内核:企业初创时体量不大,管理层的人会负责大部分的事情。优点是效率高;缺点是组织结构混乱,难以维护;
微内核:随着企业体量越来越大,管理层只负责最核心的一些工作。优点是组织结构清晰,方便维护;缺点是效率低;