# 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)