Linux0.12中断处理

1.不带出错码的中断处理过程-asm.s

(1)原寄存器入栈(由硬件完成):SS, ESP, EFLAGS, CS

(2)中断返回地址入栈:EIP

(3)要调用的函数地址入栈

(4)EAX的值与栈顶的值(要调用的函数的地址)交换

(5)其它寄存器入栈:EBX, ECX, EDX, EDI, ESI, EBP, DS, ES, FS

(6)出错号入栈:error_code。如果没有出错号,就0入栈

(7)EIP在栈中的地址入栈

(8)所有段寄存器转为内核代码段的段选择符:0x08

(9)调用相关C处理函数

(10)两次出栈(步骤6、步骤7入栈的内容)

(11)弹出除(步骤1、步骤2以外的所有内容)

(12)恢复上下文(硬件完成)


2.软中断:处理完要检测信号位图

硬件中断:处理前要发送EOI指令,如果是时钟中断,处理完也要检测信号位图

系统调用的中断:最多可带3个参数 ,通过EBX, ECX, EDX传入


3.系统调用过程

(1)保存寄存器原值:DS, FS, ES, EAX

(2)三个参数入栈:EDX, ECX, EBX

(3)DS和ES设置成内核数据段0x10,FS设置为用户数据段0x17

(4)测试EAX是否有效

(5)调用相应的C函数

(6)系统调用的返回值入栈

(7)查看执行本次调用的进程的状态,若非就绪或时间片用完,则schedule()(不管有没有schedule()都会进入第八步)

(8)返回到ret_from_sys_all继续执行

(9)若当前进程是进程0或是内核进程,则出栈,退出中断

(10)检查信号位图,调用do_signal()

(11)恢复寄存器,退出中断,返回调用程序


4.为什么用FS保存用户段?

用于执行内核数据空间和用户数据空间之间的数据复制工作。

优点:

(1)边界检查由CPU自动完成

(2)进入中断时,FS自动保存到内核堆栈,退出中断时自动弹出,不需要特殊处理

原文地址:https://www.cnblogs.com/windmissing/p/2559849.html