06 Linux中断和中断处理.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LINUX中断和中断处理 武汉大学计算机学院 郑鹏 Email:pzheng51@163.com 中断的基本概念 在Intel处理器中,中断分为内部中断和外部中断。内部中断是处理器产生的异常,而外部中断则由外部设备产生。异常必须由操作系统处理。 中断的主要功能是允许打断CPU的工作,告之其它某些急须注意的事件发生。有了中断机制后,CPU可与外部设备并行工作。 外部中断通常由设备驱动程序处理,由于使用外部中断的设备经常变化,所以Linux提供了灵活的机制,让设备驱动程序根据需要注册自己的中断处理程序。 中断的基本概念 中断分为硬中断和软中断。 硬中断:来自硬件,如外设。 软中断:来自INT n指令。 异常:来自于处理器,由执行指令引发的。 X86中断的硬件支持 中断控制器:PC使用Intel 82C59A-2 CMOS可编程控制器。此控制器的寄存器在ISA系统的内存空间中占有固定位置。硬件设备通过该控制器向CPU发出中断请求。 中断向量表寄存器TDTR:存放中断向量表IDT的基址。 CPU的四种门:任务门,中断门,陷阱门和调用门。 任务状态段TSS: 用于保存当前任务的运行状态。 Linux中断机制利用了其中的堆栈指针 可编程中断控制器 下图显示有两个8位的中断控制器级联在一起,每一个都有自己的屏蔽寄存器和中断状态寄存器。 屏蔽寄存器的地址是0x21 和0xA1, 状态寄存器的地址是0x20 和0xA0。 往屏蔽寄存器中的某一位写入1,则允许相应的中断;如果写入0,则会禁止相应的中断。所以,向屏蔽寄存器中的第三位写入1,将允许中断3;写入0,则将禁止中断3。 但不幸的是,屏蔽寄存器是只写的,你无法读取该寄存器。这样,Linux系统自己必须保留一份写入到寄存器中的内容。 可编程中断控制器 当发生中断信号时,中断处理程序读取两个中断状态寄存器(ISR)的值。它将位于0x20的ISR放入一个16位的中断寄存器的低8位,同时将位于0xA0的ISR放入高8位。PIC1中的第二位用于中断控制器的级连,所以任何来自PIC2的中断都将导致PIC1中的第二位置1。 中断向量表的初始化 处理器给每个中断和异常一个标识号,称为中断向量。系统中共有256个中断向量,其中0~31已经赋给异常和不可屏蔽中断(NMI),32—~255为用户定义的中断(IRQ),可以将其赋给外部设备。 要处理中断或异常,需要将中断向量和它的处理程序对应起来。 Intel系统通过中断描述符表IDT实现这种对应关系。 IDT是一个描述符数组,有一组门描述符组成,每一个中断向量对应一个门描述符。一个门描述符占8字节。 中断向量表的初始化(1) 异常和系统调用 填陷阱门 不同的异常的中断服务程序各不相同 由trap_init()填写中断向量 外部中断 填中断门 外部中断服务程序实际上都跳转统一的中断服务程序 由init_IRQ()填写中断向量 中断向量表的初始化(2) trap_init() 在中断向量表中填上int0-int 19的中断向量,并填上system_call的中断向量,每个中断向量表项填上相应的门(外部中断填中断门,异常填陷阱门)。 trap_init()(arch/i386/kernel/traps.c): set_system_gate(0x80, system_call) –陷阱门,中断号0x80,入口地址system_call –int0x80将触发一个系统调用 单一入口,通过使用系统调用号标识具体的系统调用 中断向量表的初始化(3) arch/i386/kernel/traps.c: #define _set_gate(gate_addr,type,dpl,addr) In trap_int(): set_trap_gate(0,divide_error); set_trap_gate(1,debug); set_intr_gate(2,nmi); set_system_gate(3,int3); /* int3-5 can be called from all */ set_system_gate(4,overflow); set_system_gate(5,bounds); set_trap_gate(6,invalid_op); set_trap_gate(7,device_not_available); set_trap_gate(8,double_fault); set_trap_gate(9,coprocessor_segment_overrun); set_trap_gate(10,invalid_TSS); set_trap_gate(11,segment_not_present); set_trap_gate(12,sta

文档评论(0)

dart001 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档