linux中断和异常

中断通常被定义为一个事件,该事件改变处理器的执行顺序。

中断分为硬件中断(异步中断)软件中断(同步中断/异常)

同步中断是由CPU本身产生又叫内部中断,叫同步是因为只有在一条指令终止执行后CPU才发出中断,不能在执行期间所以也叫做异常,比如系统调用。异常分故障、陷阱、异常终止、编译异常

异步中断由外部硬件设备产生也叫外部中断,异步中断可在任何时间产生所以叫中断。但是在临界区不可以中断。所以临界区要小,中断分可屏蔽中断、非屏蔽中断。

每个中断由0-255之间一个数字来标识。对于中断int0~int31(0X00~0X1f),每个中断的功能是由Intel固定设定或保留用的,属于软件中断,但intel称之为异常,因为这些中断是在CPU执行指令时探测到异常情况引起的。通常还可分为故障(fault)陷阱(trap)两类。中断int32~int255(0x20~0xff)可以由用户自己设定。在linux系统中,则将int32~int47(0x20~0x2f)对应于8259A中断控制芯片发出的硬件中断请求信号IRQ0~IRQ15;并把程序编程发出的系统调用中断设置为Int28(0x80)<确实系统调用对应软中断80>

在进程将控制权交给中断处理程序之前,CPU会首先将至少12字节的信息压入中断处理程序的堆栈中。<内核完全注释p70>

涉及到由用户态切换到内核态的步骤主要包括:

[1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。

[2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。

[3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

关于esp, eiphttp://blog.csdn.net/chenlycly/article/details/37912417

1.EIP寄存器里存储的是CPU下次要执行的指令的地址。

 也就是调用完fun函数后,让CPU知道应该执行main函数中的printf("函数调用结束")语句了。

2.EBP寄存器里存储的是是栈的栈底指针,通常叫栈基址,这个是一开始进行fun()函数调用之前,由ESP传递给EBP的。(在函数调用前你可以这么理解:ESP存储的是栈顶地址,也是栈底地址。)

3.ESP寄存器里存储的是在调用函数fun()之后,栈的栈顶。并且始终指向栈顶。

等到调用结束,EBP会把其地址再次传回给ESP。所以ESP又一次指向了函数调用结束后,栈顶的地址。

更多关于寄存器的内容,需要看这里:

http://blog.csdn.net/chenlycly/article/details/37912683

4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些
低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、
除、输入/输出等操作,它们的使用频率很高;
寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 
寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作
中,当移多位时,要用CL来指明移位的位数;
寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也
可用于存放I/O的端口地址。

2、变址寄存器

32位CPU有2个32位通用寄存器ESI和EDI。它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

CPU内部的段寄存器:
CS——代码段寄存器(Code Segment Register),其值为代码段的段值;
DS——数据段寄存器(Data Segment Register),其值为数据段的段值;
ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

中断描述符表(IDT)

中断描述符表(IDT)是一个系统表,他与每一个中断或异常向量联系,每一个中断在表中有相应的中断或异常处理程序的入口地址

内核在允许中断发生前,也就是在系统初始化时,必须把 IDT 表的初始化地址装载到 idtr 寄存器中,初始化表中的每一项。

初始化中断描述符表:

内核启用中断以前必须把IDT表的初始地址装载到idtr寄存器,并初始化表中每一项

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值