前言
- 在分析 Android 源码的过程中,往往会经历 app -> framework -> native -> kernel 的过程,最终就来到了用户程序与内核层序的边界,即:系统调用(System Call);
- 清晰地理解系统调用的相关概念,对于后续深刻理解其他重点知识大有裨益。在这篇文章里,我将简单分析 中断 &系统调用 的相关概念,如果能帮上忙,请务必点赞加关注,这真的对我非常重要。
1. 中断机制
1.1 什么是中断?
- 定义
中断(interrupt)是计算机系统中的基本机制之一。即:在计算机运行过程中,当发生某个事件后,CPU 会停止当前程序流,转而去处理该事件,并在处理完毕后继续执行原程序流。
相关概念 | 描述 |
中断分类 | 硬中断(Hardware Interrupt)& 软中断(Software Interrupt) |
中断向量表(Interrupt Vector Table) | 记录了中断号与中断服务程序内存地址的映射关系 |
中断服务程序 / 中断处理程序(Interrupt Service) | 通过中断向量表定位到的特定处理程序 |
1.2 为什么引入中断?
中断机制的好处是 化主动为被动,避免 CPU 轮询等待某条件成立。如果没有中断机制,那么“某个条件成立”就需要 CPU 轮询判断,这样就会增加系统的开销。而使用中断机制,就可以在条件成立之后,向 CPU 发送中断事件,强制中断 CPU 执行程序,转而去执行中断处理程序。
1.3 硬中断
硬中断由外部设备(例如:磁盘,网卡,键盘,时钟)产生,用来通知操作系统外设状态变化。
时钟中断: 一种硬中断,用于定期打断 CPU 执行的线程,以便切换给其他线程以得到执行机会。
硬中断的处理流程如下:
- 1、外设 将中断请求发送给中断控制器;
- 2、中断控制器 根据中断优先级,有序地将中断传递给 CPU;
- 3、CPU 终止执行当前程序流,将 CPU 所有寄存器的数值保存到栈中;
- 4、CPU 根据中断向量,从中断向量表中查找中断处理程序的入口地址,执行中断处理程序;
- 5、CPU 恢复寄存器中的数值,返回原程序流停止位置继续执行。
1.4 软中断
软中断是一条 CPU 指令,由当前正在运行的进程产生。
软中断模拟了硬中断的处理过程:
- 1、无
- 2、无
- 3、CPU 终止执行当前程序流,将 CPU 所有寄存器的数值保存到栈中;
- 4、CPU 根据中断向量,从中断向量表中查找中断处理程序的入口地址,执行中断处理程序;
- 5、CPU 恢复寄存器中的数值,返回原程序流停止位置继续执行。
系统调用: 是一种软中断处理程序,用于让程序从用户态陷入内核态,以执行相应的操作。
2. 系统调用
2.1 操作系统与应用的边界
- 内核空间
操作系统(Operating System)是管理计算机硬件与软件资源的程序,操作系统内核驻留在受保护的内核空间。
- 用户空间
应用是运行在操作系统上运行的程序,工作在用户空间。
- 隔离
处于安全性和稳定性考虑,用户空间程序无法直接执行内核代码(例如:I/O 读写、创建新进程/线程),也无法访问内核数据,必须通过系统调用。
2.2 系统调用的定义
系统调用(Syscall) 是一种软中断处理程序,用于让程序从用户态陷入内核态,以执行相应的操作。
2.3 系统调用的作用
当发生系统调用时,会让程序从用户态陷入内核态,以执行相应的操作。
2.4 系统调用中断处理程序的流程
- 1、程序从用户态陷入内核态
- 2、根据系统调用号,在系统调用表中查找对应的系统调用函数的内存地址,执行系统调用函数。
- 3、程序从内核态返回用户态