异常控制流(ECF)
异常可以分为四种
中断,陷阱,故障,终止
中断
中断时异步的,是处理IO设备的信号,例如正在读取磁盘(DMA)完毕后,发送信号到cpu芯片的一个引脚,这时,cpu会停止当前工作,根据传递来的异常号码查询异常表的异常处理程序,等处理完之后,控制会跳转到中断发生时的下一条命令,程序继续执行
陷阱
陷阱执行完毕之后,也是会返回到发生陷阱时的下一条指令
陷阱最重要的用途就是在用户进程和内核之间提供一个系统调用
用户态进程准备向内核请求服务时,内核允许用户进程通过syscall, 会产生一个异常处理程序的陷阱,对于linux来说系统调用的参数不是通过栈传递的,而是通过寄存器传递的
系统调用&普通函数调用区别
普通调用只在用户态内存中,且只能访问和函数相同的栈
系统调用运行在内核模式中,可以访问内核中的栈
故障
故障是由错误情况引起的,会将控制转移到故障处理程序处理,得到的结果可能是终止程序或者返回引起故障的地方重新执行
一个比较经典的例子是缺页异常
当指令引用一个虚拟内存地址时,对应的物理地址不存在主存中,就会触发故障处理程序,从磁盘读入相关的页面到主存中,然后将控制权重新返回给引用内存的指令,这时就会读到相应的内存地址,顺利执行
终止 当发生无法修复的异常时,比如硬件设备DRAM/SRAM损坏,会导致整个进程终止