概念
- 操作系统 - 管理计算机硬件与软件资源的软件.是用户与系统交互的操作接口.为它上面运行的程序提供服务.
- 操作系统内核 - 操作系统的核心.负责管理系统的进程.内存.设备驱动程序.文件和网络系统.一个内核不是一套完整的操作系统.如Linux.
- Linux操作系统 - 基于Linux 内核的操作系统.通常由Linux内核.shell(特殊的应用程序.提供运行其他程序的接口).文件系统和应用程序.
Linux体系结构
Linux 的运行空间 = 内核空间 + 用户空间
- 内核空间 - 存放的是整个内核代码和所有内核模块.以及内核所维护的数据.
- 用户空间 - 用户程序的代码和数据.
由上图可知.用户态的应用程序可以通过三种方式来访问内核态资源:
- shell
- 系统调用
- 公用函数库
Linux系统调用
操作系统提供给用户程序调用系统服务(硬件设备)的一组"特殊"接口.
为什么要设置系统调用:
- 把用户从底层的硬件编程中解放出来:
与具体的硬件完全隔离.用户不需要面向具体的硬件编码.降低了开发的复杂性和难度. - 极大的提高了系统的安全性:
将用户进程隔离实现内核"保护".用户进程不允许访问内核数据.也无法使用内核函数.用户访问内核的路径是事先规定好的.只能从规定位置进入内核.而不准许肆意跳入内核.有了这样的陷入内核的统一访问路径限制才能保证内核安全无误. - 使用户程序具有可移植性:
不同平台不同硬件
系统调用号与系统调用表
系统调用号:
每个系统调用被赋予一个系统调用号.与具体的系统调用相关联.且预先在系统文件中定义.用响应的宏表示.
系统调用表:
内核维护系统调用表.保存系统调用函数的起始地址.系统调用号对应系统调用在调用表中的偏移量.
如何切换
从用户态到内核态切换可以通过三种方式:
- 系统调用:用户态进程主动切换到内核态的方式.用户态进程通过系统调用申请使用操作系统的提供的程序完成操作.系统调用本身就是中断.
- 异常:当CPU在执行运行在用户态下的程序时.发生了某些事先不可知的异常.这时会触发由当前运行进程切换到处理此异常的内核相关程序中.也就转到了内核态.比如缺页异常.
- 外设中断:当外设完成用户的请求时.会向CPU发送中断信号.