Linux操作系统第五章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux操作系统第五章

第五章 中断与异常 数据传送控制方式 选择和衡量控制方式的原则: 数据传送速度足够高 系统开销小,所需的处理控制程序少; 能充分发挥硬件资源的能力; 数据传送控制方式 程序直接控制方式 中断控制方式 DMA方式 通道方式 Programmed Direct Control 优点:控制简单,不需要多少硬件支持 缺点: 1.CPU和外设只能串行工作; 2. CPU在一段时间内只能和一台外设交换数据,不能实现设备间的并行操作; 3.无法发现和处理由于设备和其他硬件所产生的错误。 Interrupt 中断控制方式的处理过程 优点:并行操作 缺点: 1.I/O控制器的数据缓冲寄存器满,就会发中断。 此寄存器一般较小,则在一次数据传送过程中,中断次数较多,将耗去大量CPU时间; 若设备间并行操作,则中断次数增加,造成CPU无法响应中断和数据丢失。 2.中断方式是假设外设速度很低。如果外设速度很高,则造成CPU来不及取走数据缓冲寄存器中的数据,造成数据丢失。 中断控制的主要优点: CPU只有在I/O需要服务时才响应。 外部中断: 外部设备所发出的I/O请求。 内部中断: 也称之为“异常”,是为解决机器运行时所出现的某些随机事件及编程方便而出现的。 中断向量 :8位无符号整数 中断源的编号 0~255 外设可屏蔽中断:32~47 屏蔽外部I/O请求 中断线、IRQ 异常及非屏蔽中断 :0~31 异常:CPU内部中断 非屏蔽中断:计算机内部硬件出错引起的异常 软中断:48~255 中断描述符表 : 描述中断的相关信息 中断相关的汇编指令 : 中断向量-每个中断源都被分配一个8位无符号整数作为类型码,即中断向量。(0~255) 中断的种类: 中断: 外部可屏蔽中断 外部非屏蔽中断 异常:不使用中断控制器,不能被屏蔽 故障 陷阱 Intel x86通过两片中断控制器8259A来响应15个外中断源,每个8259A可管理8个中断源。 外部设备拥有相应权限时 ,可以向特定的中断线发送中断请求信号IRQ。 外部I/O请求的屏蔽: 从CPU的角度, 清除eflag的中断标志位(关中断) 从中断控制器的角度,将中断屏蔽寄存器的相应位置位 异常就是CPU内部出现的中断,即在CPU执行特定指令时出现的非法情况。 非屏蔽中断就是计算机内部硬件出错时引起的异常情况。 Intel把非屏蔽中断作为一种异常来处理。 在CPU执行一个异常处理程序时,就不再为其他异常或可屏蔽中断请求服务。 Intel x86处理器发布了大约20种异常(具体数字与处理器模式有关)。 Linux内核必须为每种异常提供一个专门的异常处理程序。 中断描述符表(IDT):即中断向量表,每个中断占据一个表项(门描述符,8字节)。 主要门描述符为: (1)中断门(Interrupt gate):类型码为110,请求特权级(DPL)为0。 中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。 (2)陷阱门(Trap gate):类型码为111,与中断门类似,其唯一的区别是,不关中断。 (3)系统门(System gate):Linux内核特别设置的,用来让用户态的进程访问Intel的陷阱门,DPL为3。系统调用就是通过系统门进入内核的。 中断描述符表寄存器IDTR:存放中断描述符表在内存的起始地址。中断描述符表寄存器IDTR是一个48位的寄存器,其低16位保存中断描述符表的大小,高32位保存中断描述符表的基址。 调用过程指令CALL : CALL 过程名 调用中断过程的指令INT INT 中断向量 (0~255) 中断返回指令IRET IRET 加载中断描述符表的指令LIDT LIDT 48位的伪描述符 Linux内核在系统的初始化阶段要初始化可编程控制器8259A;将中断描述符表的起始地址装入IDTR寄存器,并初始化表中的每一项。 当计算机运行在实模式时,中断描述符表被初始化,并由BIOS使用 。 真正进入了Linux内核,中断描述符表就被移到内存的另一个区域,并为进入保护模式进行预初始化: 用汇编指令LIDT对中断向量表寄存器IDTR进行初始化,即把IDTR置为0; 把中断描述符表IDT的起始地址装入IDTR; setup_idt()函数填充中断描述表中的256个表项。 IDT表项的设置通过_set_gate ()函数实现 调用该函数在IDT表中插入一个中断门: void set_intr_gate(unsigned int n, void *addr) { _set_gate(idt_table+n,14,0,addr); } 调用该函数在IDT表中插入一个陷阱门

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档