预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共51页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

主要内容中断的基本概念中断的流程如图 i8259.c负责对外部中断的支持。8259芯片负责接收外部设备——如定时器、键盘、声卡等——的中断,两块8259共支持16个中断Linux中断处理特色中断控制的主要优点: CPU只有在I/O需要服务时才响应 外部中断: 外部设备所发出的I/O请求 内部中断: 也称之为“异常”,是为解决机器运行时所出现的某些随机事件及编程方便而出现的中断向量: 中断源的编号 外设可屏蔽中断: 屏蔽外部I/O请求 异常及非屏蔽中断: CPU内部中断或计算机内部硬件出错引起的异常 中断描述符表: 描述中断的相关信息 中断的相关汇编指令:中断向量: 每个中断源都被分配一个8位无符号整数作为类型码,即中断向量 中断的种类: 中断: 外部可屏蔽中断 外部非屏蔽中断 异常:不使用中断控制器,不能被屏蔽 故障 陷阱Intelx86通过两片中断控制器8259A来响应15个外中断源,每个8259A可管理8个中断源。 外部设备拥有相应权限时,可以向特定的中断线发送中断请求信号 外部I/O请求的屏蔽: 从CPU的角度,清除eflag的中断标志位 从中断控制器的角度,将中断屏蔽寄存器的相应位置位异常就是CPU内部出现的中断,即在CPU执行特定指令时出现的非法情况。 非屏蔽中断就是计算机内部硬件出错时引起的异常情况 Intel把非屏蔽中断作为一种异常来处理 在CPU执行一个异常处理程序时,就不再为其他异常或可屏蔽中断请求服务 中断的相关数据结构中断的相关数据结构中断的相关数据结构中断的相关数据结构3.2.2中断的相关数据结构中断的相关数据结构中断的相关数据结构中断的相关数据结构中断的相关数据结构中断的相关数据结构中断和异常的硬件处理: 从硬件的角度看CPU如何处理中断和异常 中断请求队列的建立: 方便外设共享中断线 中断处理程序的执行 从中断返回: 调用恢复中断现场的宏RESTORE_ALL,彻底从中断返回当CPU执行了当前指令之后,CS和EIP这对寄存器中所包含的内容就是下一条将要执行指令的虚地址。 在对下一条指令执行前,CPU先要判断在执行当前指令的过程中是否发生了中断或异常。 如果发生了一个中断或异常,那么CPU将做以下事情:确定所发生中断或异常的向量i(在0~255之间) 通过IDTR寄存器找到IDT表,读取IDT表第i项(或叫第i个门) 分“段”级、“门”级两步进行有效性检查 检查是否发生了特权级的变化由于硬件条件的限制,很多硬件设备共享一条中断线 为方便处理,Linux为每条中断线设置了一个中断请求队列 中断服务例程与中断处理程序 中断线共享的数据结构 注册中断服务例程中断服务例程(InterruptServiceRoutine):每个中断请求都有自己单独的中断服务例程 中断处理程序:共享同一条中断线的所有中断请求有一个总的中断处理程序 在Linux中,15条中断线对应15个中断处理程序structirqaction{ void(*handler)(int,void*,structpt_regs*); unsignedlongflags; unsignedlongmask; constchar*name; void*dev_id; structirqaction*next; };structirqaction{ void(*handler)(int,void*,structpt_regs*); unsignedlongflags; unsignedlongmask; constchar*name; void*dev_id; structirqaction*next; };初始化IDT表之后,必须通过request_irq()函数将相应的中断服务例程挂入中断请求队列,即对其进行注册 在关闭设备时,必须通过调用free_irq()函数释放所申请的中断请求号CPU从中断控制器的一个端口取得中断向量I 根据I从中断描述符表IDT中找到相应的中断门 从中断门获得中断处理程序的入口地址 判断是否要进行堆栈切换 调用do_IRQ()对所接收的中断进行应答,并禁止这条中断线 调用handle_IRQ_event()来运行对应的中断服务例程当处理所有外设中断请求的函数do_IRQ()执行时,内核栈顶包含的就是do_IRQ()的返回地址,这个地址指向ret_from_intr 从中断返回时,CPU要调用恢复中断现场的宏RESTORE_ALL,彻底从中断返回。中断服务例程在中断请求关闭的条件下执行,避免嵌套使中断控制复杂化 系统不能长时间关中断运行,因此内核应尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟 内核把中断处理分为两部分:上半部(tophalf)和下半部(bottomhalf),上半部内核立即执行,而下半部留着