一. 概念

  • 操作系统 - 管理计算机硬件与软件资源的软件.是用户与系统交互的操作接口.为它上面运行的程序提供服务.
  • 操作系统内核 - 操作系统的核心.负责管理系统的进程.内存.设备驱动程序.文件和网络系统.一个内核不是一套完整的操作系统.如Linux.
  • Linux操作系统 - 基于Linux 内核的操作系统.通常由Linux内核.shell(特殊的应用程序.提供运行其他程序的接口).文件系统和应用程序.

linux体系结构

参考图:

Description

linux的运行空间=内核空间+用户空间

  • 内核空间:存放的是整个内核代码和所有内核模块,以及内核维护的数据
  • 用户空间:用户程序的代码和数据

由上图可知,用户态的应用程序可以通过三种方式来访问内核态资源:

  1. shell
  2. 系统调用
  3. 公共函数库

操作系统需要两种CPU状态

内核态(kernel mode):运行操作系统程序,操作硬件 用户态(user mode):运行用户程序

指令划分

特权指令:只能由操作系统使用,用户不能使用的指令.例如:启动I/O,内存清零,修改程序状态字,设置时钟,允许/禁止中段,停机等 非特权指令:用户程序可以使用的指令.举例:控制转移,算数运算,取数指令,访管指令(使用户程序从用户态陷入内核态)

CPU状态之间的切换

用户态—>内核态:唯一途径是通过中断、异常、陷入机制(访管指令)

内核态—>用户态:设置程序状态字PSW

二. linux系统调用

操作系统提供给用户程序调用系统服务(硬件设备)的一组"特殊"的接口.

Description

为什么要设置系统调用

  • 把用户从底层的硬件编程中解放出来: 与具体的硬件完全隔离,用户不需要面向具体的硬件编码,降低了开发的复杂性和难度
  • 极大的提高了系统的安全性: 将用户进程隔离实现内核"保护",用户进程不允许访问内核数据,也无法使用内核函数.用户访问内核的路径是事先搞定好的,只能从规定位置进入内核,而不允许肆意跳入内核,用了这样的陷入内核的统一访问路径限制才能保证内核安全无误.
  • 使用户程序具有可移植性: 不同平台,不同硬件

系统调用表与系统调用号

系统调用号:

每个系统调用被赋予一个系统调用号,与具体的系统调用相关联,且预先在系统文件中定义,用相应的宏表示.

系统调用表:

内核维护系统调用表,保存系统调用函数的起始地址,系统调用号对应系统调用在调用表中的偏移量.

Description

如何切换

从用户态到内核态切换可以通过三种方式:

  1. 系统调用:用户进程主动切换到内核态的方式,用户态进程通过系统调用申请使用操作系统提供的程序完成操作,系统调用本身就是中断.
  2. 异常:当cpu在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常
  3. 外设中断:当外设完成用户的请求时,会向cpu发送中断信号.