内核中断体系结构
分类:硬件中断 软件中断
硬件中断:由电脑主机的8259A类似的硬件发出的中断,ARM中断控制器发出的中断
软中断:异常 第一类:CPU自行保留的中断,系统调用异常
代码结构
中断的工作流程
- 做CPU工作模式的转换
- 进行寄存器的拷贝与压栈
- 设置中断异常向量表
- 保存正常运行的函数返回值
- 跳转到对应的中断服务函数上
- 进行模式的复原及寄存器的复原
- 跳转回正常工作的函数地址继续运行
Linux 中断工作流程
- 将所有寄存器值 (SS, EFLAG, ESP, CS, EIP) 和错误码入栈
- 将异常码入栈(中断号)
- 将当前的函数返回值入栈(便于复原)
- 进行对应的中断服务函数
- 出栈函数返回值
- 返回所有入栈的寄存器值
中断过程的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| _divide_error: push dword ptr _do_divide_error no_error_code: xchg [esp],eax push ebx push ecx push edx push edi push esi push ebp push ds push es push fs push 0 lea edx,[esp+44] push edx mov edx,10h mov ds,dx mov es,dx mov fs,dx call eax add esp,8 pop fs pop es pop ds pop ebp pop esi pop edi pop edx pop ecx pop ebx pop eax iretd
|
有出错码时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| _double_fault: push _do_double_fault error_code: xchg [esp+4],eax xchg [esp],ebx push ecx push edx push edi push esi push ebp push ds push es push fs push eax lea eax,[esp+44] push eax mov eax,10h mov ds,ax mov es,ax mov fs,ax call ebx add esp,8 pop fs pop es pop ds pop ebp pop esi pop edi pop edx pop ecx pop ebx pop eax iretd
|