中断处理与I/O中断详解
异常处理机制
当异常发生时,系统会将异常向量存储在当前进程描述符中,并向该进程发送合适的信号,示例代码如下:
current->thread.error_code = error_code;
current->thread.trap_no = vector;
force_sig(sig_number, current);
当前进程会在异常处理程序终止后立即处理该信号。信号处理可以在用户模式下由进程自身的信号处理程序完成(如果存在),也可以在内核模式下进行。若在内核模式处理,内核通常会终止该进程。
异常处理程序会检查异常是在用户模式还是内核模式发生。若在内核模式,还会检查是否是由于系统调用传入无效参数导致。若出现其他内核模式异常,则可能是内核存在错误。此时,异常处理程序会调用 die() 函数,在控制台打印所有CPU寄存器的内容(即内核oops),并通过调用 do_exit() 终止当前进程。
当实现异常处理的C函数结束时,代码会执行 jmp 指令跳转到 ret_from_exception() 函数。
中断处理概述
大多数异常通过向引发异常的进程发送Unix信号来处理,这种方式能让内核快速处理异常。但对于中断,这种方法并不适用,因为中断往往在相关进程(如请求数据传输的进程)被挂起后才到达,此时运行的可能是完全不相关的进程,向当前进程发送Unix信号没有意义。
<
超级会员免费看
订阅专栏 解锁全文
1954

被折叠的 条评论
为什么被折叠?



