您的位置:首页 > 运维架构 > Linux

深入理解Linux内核-中断和异常

2015-07-14 21:19 756 查看
Linux内核代码查看

http://androidxref.com/


中断:被定义位一个事件,它能改变处理器执行指令的顺序。它对应硬件(CPU、其他硬件设备)电路产生的电信号。

同步中断:指令执行时CPU控制单元产生;称为同步,是因为只有在一条指令终止执行后CPU才回发出中断。也被称为异常

异步中断:其他硬件设备按照CPU时钟信号随机产生的。也被简称中断

中断的约束:1、中断必须尽快处理完成;中断一般被分两部分执行:关键而且紧急的部分,内核立即执行;其余部分内核稍后执行;
       2、中断的处理必须能满足嵌套,即当正在处理一个中断时,另一个中断又发生了的情况,必须尽量支持
      3、中断可以被禁止,但必须尽可能的限制使用

中断:可屏蔽中断、非屏蔽中断
异常:处理器探测异常(故障、陷阱、异常终止),编程异常


引入信号的动机:

IRQ(Interrupt Request)如何引起中断:

IRQ:能发出中断请求的硬件设备都又一条名为IRQ都输出线;
IRQ line:与可编程中断控制器的硬件电路的输入引脚相连。

可编程中断控制器(IPC):
1、监视IRQ线,如果两条或者以上的IRQ线产生信号,选择引脚编号较小
2、如果只有一个引发信号 a、将它转化为对应的向量;b、将向量存放到中断控制器的IO端口,允许CPU通过数据总线读取;c、把引发信号发送到处理器的INTR引脚,即产生中断
  d、等待,直到CPU通过吧这个中断信号写入可编程中断控制器的一个I\O端口来确认它,清除INTR线;
3、返回第一步。

I/O APIC(I/O 高级可编程中断控制器):


80x86微处理器如何在硬件级处理中断和异常:

异常处理程序的结构:
1、在内核堆栈中保存大多数寄存器的内容
2、用高级的c函数处理异常
3、通过ret_from_exception() 函数从异常处理程序退出。


如果初始化中断结构必须的数据结构:

内核启用中断前,必须把IDT(中断描述符表)的初始地址装到idtr寄存器,并初始化其中的每一项。系统初始化时就需要完成。

IDT的初始化:
1、当计算机还运行在实模式的时候IDT被初始化,由BIOS例程使用,
2、当linux接管之后,IDT被移到RAM的一个区域,进行二次初始化。

内核初始化的过程中,先用一个中断门填充IDT的256个表项,然后用有意义的陷阱和中断处理程序替换它。

完成初始化之后,对于每一个PIC确认的IRQ,IDT都有一个专门的中断门。


如何在软件级处理中断信号:

中断处理流程:
1、硬件通过IRQ线通知PIC
2、PIC将中断向量放到寄存器
3、处理器读取寄存器,存如RAM。由中断处理例程处理(ISR)
4、通知PIC

注意:内核启用中断之前,必须知道IRQ号与I/O设备之间的对应关系,否则内核不知道那个向量对应哪个设备,如果处理。
IRQ号与设备之间的对应关系,在初始化设备驱动程序的时候建立的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: