目的:
1.硬件的中断响应——>内核驱动中的中断
2.系统调用的函数响应(sys_call)——>系统调用
3.自定义中断——>软件的软中断模式
4.信号中断(kill -signalnum)——>对了解信号的使用、创建等
5.系统的异常和错误——>系统的异常获取、了解系统异常的作用
1.Linux的中断机制
1.1 分类:硬件中断、软件中断
硬中断: 由电脑主机的8255A类似的硬件中断控制芯片发出的中断
ARM中断控制器发出的中断
软中断: 异常:CPU自行保留的异常、系统调用异常
1.2 代码结构:
asm.s | trap.c |
system_call.s | fork.c、signal.c、exit.c、sys.c |
2.中断的工作流程
2.1 回忆:
(1)做CPU工作模式的转化
(2)进行寄存器的拷贝与压栈
(3)设置中断异常向量表
(4)保存正常运行的函数返回值
(5)跳转到对应的中断服务函数上去运行
(6)进行模式的复原及寄存器的复原
(7)跳转回正常工作的函数地址继续运行
2.2 Linux中中断的工作流程:
(1)将所有的寄存器值入栈
(2)将异常码入栈(中断号)
(3)将当前的函数返回值进行入栈(为了复原)
————————————————————————————————中断前的处理过程
(4)调用对应的中断服务函数
————————————————————————————————中断的执行过程
(5)出栈函数返回值
(6)返回所有入栈的寄存器值
————————————————————————————————中断的恢复过程
如图所示:
栈的内存分布图:
SS地址 |
ESP的值 |
EFLAGS |
CS |
EIP |
有出错进行压栈,无出错码就不做 |
EIP(函数的返回值寄存器)【<——esp0】 |
中断处理函数的调用C函数入口地址(EAX)【<——esp1】 |
EBX |
ECX |
EDX |
EDI |
ESI |
EBP |
DS |
ES |
FS |
ERROR CODE |
EIP ESP(中断的返回地址) |
中断前的处理过程,中断后的恢复过程 | 中断的执行过程 | |
硬件中断的处理过程 | asm.s | trap.c |
软件及系统调用的处理过程 | system_call.s | fork.c,signal.c,exit.c,sys.c |
3.中断的代码实现过程
中断前的处理过程,中断后的恢复过程 | 中断的执行过程 | |
硬件中断的处理过程 | asm.s | trap.c |
3.1 trap_init
set_trap_gate 设置的权限较高,只能由用户程序调用
set_system_gate 设置的权限较低,能由用户和系统所有的进程调用
3.2 system_call
所有的系统调用C函数放到了一个统一的sys_call_table
系统调用的操作码
sys_call_table[]:如下链接