4.0: 陷阱和系统调用简介
三种特殊事件
在CPU执行过程中,有三种事件会导致CPU将当前执行的指令暂停并将开始责权交给处理事件的特殊代码。这三种事件为
系统调用:用户程序通过执行ecall请求内核执行特定操作
异常:某个指令(用户或内核指令)执行了非法操作,如除0操作或使用了一个非法的虚拟地址
设备中断:当设备发出信号表示它需要处理时,如硬盘设备结束了读或写的请求
这三种情形有一个通用的术语统称为陷阱(trap) 典型情况下trap执行透明化,在trap发生时执行的代码暂停后后面将会继续,好像没有发生过什么特殊的事情一样
处理trap的通常流程是:
控制权转移到内核,内核保存当前状态(寄存器和一些其他状态)
内核执行相应的处理代码(比如系统调用或设备驱动)
然后恢复状态并返回,以便程序继续执行.
在xv6操作系统中,所有的trap都在内核中处理,这样可以确保设备隔离、资源共享以及异常处理的安全性.
xv6的trap处理过程包括四个阶段:
CPU硬件操作,汇编预处理,一些汇编的指令为内核的C代码做一些准备工作
C语言处理函数负责trap需要实现的功能
系统调用或设备驱动程序的执行,内核里用的同一个程序逻辑执行三种类型的traps
但是从实现来看下面两种情况用独立的代码分别处理比较方便
来自用户态的traps
来自内核态的traps
处理traps的内核代码(汇编或c)通常称为句柄(handler),第一个handler指令通常用汇编进行实现,有时候称为向量(vector)