Linux 操作系统 chp5.pptVIP

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux 操作系统 chp5

第五章 中断与异常 中断控制的主要优点: CPU只有在I/O需要服务时才响应 外部中断: 外部设备所发出的I/O请求 内部中断: 也称之为“异常”,是为解决机器运行时所出现的某些随机事件及编程方便而出现的 中断向量 : 中断源的编号 外设可屏蔽中断: 屏蔽外部I/O请求 异常及非屏蔽中断 : CPU内部中断或计算机内部硬件出错引起的异常 中断描述符表 : 描述中断的相关信息 中断相关的汇编指令 : 中断向量-每个中断源都被分配一个8位无符号整数作为类型码,即中断向量 中断的种类: 中断: 外部可屏蔽中断 外部非屏蔽中断 异常:不使用中断控制器,不能被屏蔽 故障 陷阱 Intel x86通过两片中断控制器8259A来响应15个外中断源,每个8259A可管理8个中断源。 外部设备拥有相应权限时 ,可以向特定的中断线发送中断请求信号 外部I/O请求的屏蔽: 从CPU的角度, 清除eflag的中断标志位 从中断控制器的角度,将中断屏蔽寄存器的相应位置位 异常就是CPU内部出现的中断,即在CPU执行特定指令时出现的非法情况。 非屏蔽中断就是计算机内部硬件出错时引起的异常情况 Intel把非屏蔽中断作为一种异常来处理 在CPU执行一个异常处理程序时,就不再为其他异常或可屏蔽中断请求服务 中断描述符表(IDT):即中断向量表,每个中断占据一个表项 调用过程指令CALL : CALL 过程名 调用中断过程的指令INT INT 中断向量 中断返回指令IRET IRET 加载中断描述符表的指令LIDT LIDT 48位的伪描述符 Linux内核在系统的初始化阶段要初始化可编程控制器8259A;将中断描述符表的起始地址装入IDTR寄存器,并初始化表中的每一项 当计算机运行在实模式时,中断描述符表被初始化,并由BIOS使用 。 真正进入了Linux内核,中断描述符表就被移到内存的另一个区域,并为进入保护模式进行预初始化 IDT表项的设置通过_set_gaet()函数实现 调用该函数在IDT表中插入一个中断门:set_intr_gate(unsigned int n, void *addr) 调用该函数在IDT表中插入一个陷阱门:set_trap_gate(unsigned int n, void *addr) 调用该函数在IDT表中插入一个系统门:set_system_gate(unsigned int n, void *addr) trap_init()函数用于设置中断描述符表开头的19个陷阱门和系统门 这些中断向量都是CPU保留用于异常处理的 ,例: set_trap_gate(0,divide_error); set_trap_gate(1,debug); set_trap_gate(19,simd_coprocessor_error); set_system_gate(SYSCALL_VECTOR,system_call); 中断门的设置是由init_IRQ()函数中的一段代码完成的 : 设置时必须跳过用于系统调用的向量0x80 中断处理程序的入口地址是一个数组interrupt[],数组中的每个元素是指向中断处理函数的指针。 中断和异常的硬件处理 : 从硬件的角度看CPU如何处理中断和异常 中断请求队列的建立: 方便外设共享中断线 中断处理程序的执行 从中断返回: 调用恢复中断现场的宏RESTORE_ALL,彻底从中断返回 当CPU执行了当前指令之后,CS和EIP这对寄存器中所包含的内容就是下一条将要执行指令的虚地址。 在对下一条指令执行前,CPU先要判断在执行当前指令的过程中是否发生了中断或异常。 如果发生了一个中断或异常,那么CPU将做以下事情 : 确定所发生中断或异常的向量i(在0~255之间) 通过IDTR寄存器找到IDT表,读取IDT表第i项(或叫第i个门) 分“段”级、“门”级两步进行有效性检查 检查是否发生了特权级的变化 由于硬件条件的限制,很多硬件设备共享一条中断线 为方便处理,Linux为每条中断线设置了一个中断请求队列 中断服务例程与中断处理程序 中断线共享的数据结构 注册中断服务例程 注销中断服务例程 中断服务例程(Interrupt Service Routine ):每个中断请求都有自己单独的中断服务例程 中断处理程序:共享同一条中断线的所有中断请求有一个总的中断处理程序 在Linux中,15条中断线对应15个中断处理程序 struct irqaction { void (*handler)(int, void *, struct pt_regs *); unsigned long flags; un

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档