用户态与内核态
为什么区分内核态和用户态
- 用户会进行不安全的访问和修改。
- 操作系统没法进程调度,因为拿不到cpu的执行权。
所以要区分权限,普通进程需要执行特殊操作的时候,需要让内核代为操作(陷入内核)。
什么时候陷入内核
系统调用(trap)、中断(interrupt)和异常(exception)。
系统调用是用户进程主动发起的操作。发起系统调用,陷入内核,由操作系统执行系统调用,然后再返回到进程。
中断和异常是被动的,无法预测发生时机。
系统调用(trap)
也叫软中断,同步事件,主动发起。
每个系统调用有一个唯一的整数号,对应于内核中一个系统调用表(sys_call_table)的偏移量。这个系统调用表中的每个条目表示一个系统调用的代码位置。
中断(interrupt)
中断由处理器外部的硬件产生,异步事件,无法预测。
包括:I/O中断、时钟中断、调试中断等。
每个中断都有一个中断号。操作系统使用中断描述符表(Interrupt Descriptor Table,IDT)来保存每个中断的中断处理程序的地址。操作系统会根据中断号,在中断描述表中查找并执行相应的中断处理程序。
异常(exception)
异常是一种错误情况,是执行当前指令的结果,可能被错误处理程序修正,也可能直接终止应用程序。异常是同步的。
包括:除法异常、缺页异常等。
异常处理程序的地址也保存在中断描述符表(IDT)中。