《Linux内核设计与实现》读书笔记(七)- 中断处理【转】

简介:

转自:http://www.cnblogs.com/wang_yb/archive/2013/04/19/3030345.html

中断处理一般不是纯软件来实现的,需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理,特别是驱动程序的开发。

主要内容:

  • 什么是中断
  • 中断类型
  • 中断相关函数
  • 中断处理机制
  • 中断控制方法
  • 总结

 

1. 什么是中断

为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。

没有中断的话,CPU和外围设备之间协同工作可能只有轮询这个方法:CPU定期检查硬件状态,需要处理时就处理,否则就跳过。

当硬件忙碌的时候,CPU很可能会做许多无用功(每次轮询都是跳过不处理)。

 

中断机制是硬件在需要的时候向CPU发出信号,CPU暂时停止正在进行的工作,来处理硬件请求的一种机制。

 

2. 中断类型

中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。

异步中断:CPU处理中断的时间过长,所以先将硬件复位,使硬件可以继续自己的工作,然后在适当时候处理中断请求中耗时的部分。

举个例子:网卡的工作原理

  1.     网卡收到数据包后,向CPU发出中断信号,请求处理接收到的数据包
  2.     CPU将收到的数据包拷贝到内存后,即通知网卡继续工作
  3.     至于数据包拷贝至内存后的处理会在适当的时候进行

 

这样做避免了处理数据包时间过长导致网卡接收数据包速度变慢。

 

同步中断:CPU处理完中断请求的所有工作后才反馈硬件

举个例子:系统异常处理(比如运算中的除0操作)

  1.     应用程序出现异常后,需要内核来处理
  2.     内核调用相应的异常处理函数来处理异常
  3.     处理完后终了应用程序或者给出message

 

同步中断应该处理能很快完成的一种中断。

 

3. 中断相关函数

实现一个中断,主要需要知道3个函数:

  • 注册中断的函数
  • 释放中断的函数
  • 中断处理程序的声明

 

3.1 注册中断的函数

    位置:<linux/interrupt.h>  include/linux/interrupt.h

 

定义如下:

复制代码
复制代码
/*
 * irg     - 表示要分配的中断号
 * handler - 实际的中断处理程序
 * flags   - 标志位,表示此中断的具有特性
 * name    - 中断设备名称的ASCII 表示,这些会被/proc/irq和/proc/interrupts文件使用
 * dev     - 用于共享中断线,多个中断程序共享一个中断线时(共用一个中断号),依靠dev来区别各个中断程序
 * 返回值:
 * 执行成功:0
 * 执行失败:非0
 */
int request_irq(unsigned int irq,
                irq_handler_t handler,
                unsigned long flags,
                const char* name,
                void *dev)
复制代码
复制代码

 

3.2 释放中断的函数

定义比较简单:

void free_irq(unsigned int irq, void *dev)

如果不是共享中断线,则直接删除irq对应的中断线。

如果是共享中断线,则判断此中断处理程序是否中断线上的最后一个中断处理程序,

    是最后一个中断处理程序 -> 删除中断线和中断处理程序

    不是最后一个中断处理程序 -> 删除中断处理程序

 

3.3 中断处理程序的声明

声明格式如下:

复制代码
复制代码
/* 
 * 中断处理程序的声明
 * @irp  - 中断处理程序(即request_irq()中handler)关联的中断号
 * @dev  - 与 request_irq()中的dev一样,表示一个设备的结构体
 * 返回值:
 * irqreturn_t -  执行成功:IRQ_HANDLED  执行失败:IRQ_NONE
 */
static irqreturn_t intr_handler(int, irq, void *dev)
复制代码
复制代码

 

4. 中断处理机制

中断处理的过程主要涉及3函数:

  • do_IRQ 与体系结构有关,对所接收的中断进行应答
  • handle_IRQ_event 调用中断线上所有中断处理
  • ret_from_intr 恢复寄存器,将内核恢复到中断前的状态

 

处理流程可以参见书中的图,如下:

interrupt

 

5. 中断控制方法

常用的中断控制方法见下表:

函数

说明

local_irq_disable() 禁止本地中断传递
local_irq_enable() 激活本地中断传递
local_irq_save() 保存本地中断传递的当前状态,然后禁止本地中断传递
local_irq_restore() 恢复本地中断传递到给定的状态
disable_irq() 禁止给定中断线,并确保该函数返回之前在该中断线上没有处理程序在运行
disable_irq_nosync() 禁止给定中断线
enable_irq() 激活给定中断线
irqs_disabled() 如果本地中断传递被禁止,则返回非0;否则返回0
in_interrupt() 如果在中断上下文中,则返回非0;如果在进程上下文中,则返回0
in_irq() 如果当前正在执行中断处理程序,则返回非0;否则返回0

 

总结

中断处理对处理时间的要求很高,如果一个中断要花费较长时间,那么中断处理一般分为2部分。

上半部只做一些必要的工作后,立即通知硬件继续自己的工作。

中断处理中耗时的部分,也就是下半部的工作,CPU会在适当的时候去完成。












本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5138714.html,如需转载请自行联系原作者

相关文章
|
3天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
1天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
18 4
|
3天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
5天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
28 4
|
6天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
存储 关系型数据库 编译器
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
112 1
|
存储 算法 编译器
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(二)
C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽(二)
71 1
|
存储 算法 Java
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
|
安全 Java C++
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(上)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计