操作系统处于中间层,向下管理和控制硬件,向上为外层软件和用户编写的程序提供使用方便、功能强大的服务。
就如下面视图所展示:
(Kernel mode:内核态 User mode:用户态)
操作系统的任务是:
- 使用户方便的使用计算机。
- 使计算机硬件高效的运行。
操作系统提供的抽象概念
操作系统为用户管理硬件资源,用户不需要面对硬件资源,而是面对操作系统提供的各种抽象概念进行操作。
操作系统提供的抽象概念主要有以下几种:
进程
进程我的理解是:进程是程序运行的载体,就好像杯子是水的载体一般。
进程包含了程序运行所需要的所有信息。(可执行程序,程序的堆栈等等)
与一个进程有关的所有信息,除了该进程自身地址空间的内容以外,均存放在操作系统的一张表中,称为进程表(数组或链表结构)。
地址空间
现代操作系统是多道程序设计的,就是说在内存中存在多个程序。
这时候就需要一个机制来隔离不同的程序,避免干扰。
现代操作系统通常使用虚拟内存技术。操作系统可以把部分地址空间装入主存,部分留在磁盘上,在需要时再交换它们。
文件
支持操作系统的一个重要的概念是文件系统。
文件系统隐藏了磁盘和其他I/O设备的细节,统一提供了文件这个抽象的概念。
系统调用
如最上面的视图所展示的那样,操作系统运行在内核态(一般都是)。
所以操作系统所提供的抽象概念也在内核态。
但是一般的过程调用是进入不了内核态的,只有系统调用可以进入内核态,使用操作系统所提供的抽象概念。
除了进入内核态,系统调用和一般的过程调用没什么区别。如下图:
第5步应为read调用的系统调用编号;
第7步为根据系统调用编号在一张指针表中找到相应的程序运行
系统调用比一般的过程调用要复杂得多,所以一般操作系统会提供库调用,把系统调用包装的简单一些,如上面的那个图,4过程是read库调用,5才是read系统调用。
基本过程就是下面这个:
1参数nbytes压栈
2参数&buffer压栈
3参数fd压栈
4对库过程read进行实际调用
5把系统调用的编号放在寄存器中
6执行TRAP指令,切换到内核态,在内核中一个固定地址开始执行
7内核代码检查系统调用编号,发出系统调用处理指令
8系统调用句柄执行
9控制返回给用户空间库过程
10以通常的过程调用返回的方式,返回到用户程序
11用户程序清除堆栈空间