armlinux中断异常的处理分析.pdfVIP

  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文档。上传文档
查看更多
基于 ARM Linux 中断、异常的处理分析 本文是基于ARM S3C2410X 系统的Linux 2.6 中断、异常和系统调用的处理分析。 主要有以下几个部分: 1. ARM 的硬件中断机制 2. Linux 2.6 对 ARM 中断向量表的初始化 3. Linux 2.6 对 ARM 中断、异常的处理(从汇编--C 语言函数;asm_do_IRQ ) 一、 ARM 的硬件中断机制 1、中断的基本概念 在嵌入式系统中外部设备的功能实现主要是依靠中断机制来实现的,即将设 备功能程序的实现以中断服务子程序的形式进行组织。 中断 (interrupt )通常被定义为一个事件,该事件改变处理器执行的指令顺序。 这样的事件与 CPU 芯片外部硬件电路产生的电信号相对应。 中断的产生 每个能够发出中断请求的硬件设备控制器都有一条称为 IRQ(Interrupt ReQuest) 的输出线。所有的IRQ 线都与一个中断控制器的输入引脚 相连,中断控制器与 CPU 的INTR 引脚相连。 设备 设备 控制器 中断 控制器 IRQ CPU INTR 中断向量 每个中断和异常由 0~255 之间的一个数(8 位)来标识,Intel 称其为 中断向量。 中断描述符表 (Interrupt Descriptor Table ,IDT )是一个系统表,它与每一个中断 或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序的入口地 址。内核在允许中断发生前,必须适当地初始化 IDT 。表中的每一项对应一个中 断或异常向量,每个向量由 8 个字节组成。因此,最多需要 256*8=2048 字节来 存放 IDT 。CPU 的idtr 寄存器指向 IDT 表的物理基地址。 2、中断和异常的硬件处理 在内核被 Init 进程初始化后,CPU 运行在保护模式下。当执行了一条指令后, cs 和 eip 这对寄存器包含了下一条将要执行的指令的逻辑地址。在执行这条指令 之前,CPU 控制单元会检查在运行前一条指令时是否发生了一个中断或者异常。 如果发生了一个中断或异常,那么 CPU 控制单元执行下列操作: (1) 确定与中断或者异常关联的向量 i (0~255 )。 (2) 读由 idtr 寄存器指向的 IDT 表中的第 i 项。 (3) 从 gdtr 寄存器获得 GDT 的基地址,并在 GDT 中查找,以读取IDT 表项中的 选择符所标识的段描述符,这个描述符指定中断或异常处理程序所在段的基 地址。 (4) 确定中断是由授权的发生源发出的。 中断:中断处理程序的特权不能低于引起中断的程序的特权(当前特权级CPL —对应 CS 寄存器中的低两位 其值应该小于段描述符—对应 GDT 表 项中的描述符特权级 DPL ,特权级高于DPL ,即当前代码是能够访问 相应的段的,产生一个“General protection ”异常); 编程异常:还需进一步比较 CPL 与对应 IDT 表项中的门描述符的 DPL 。 即当 CPL 的特权级高于 GDT 表项中的描述符特权级 DPL ,但低于 IDT 表 项中的门描述符的 DPL ,就是异常。 (5) 检查是否发生了特权级的变化,一般指是否由用户态陷入了内核态。也就是 说 CPL 是否不同于所选择的段描述符的 DPL ,如果是,控制单元必须开始使 用与新的特权级相关的堆栈,通过以下操作来做到这点: A 、读tr 寄存器,访问运行进程的 TSS 段; B 、用与新特权级相关的栈段和栈指针装载 ss 和 esp 寄存器。这些值可以在 进程的 TSS 段中找到; C、在新的栈中保存 ss 和 esp 以前的值,这些值指明了与旧特权级相关的栈 的逻辑地址。 (6) 若发生

文档评论(0)

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

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

1亿VIP精品文档

相关文档