Linux内核学习(六)—— 中断(基于Linux 2.6内核)

news2024/11/15 23:40:29

一、中断

中断使得硬件得以发出通知给处理器。中断随时都可以产生,如键盘敲击就会触发中断,通知操作系统有按键按下。

不同设备对应的中断不同,而每个中断都通过一个唯一的数字标识。这些中断值通常被称为中断请求(IRQ)线。每个 IRQ 线都会关联一个数值量。

异常与中断不同,它在产生时必须考虑与处理器时钟同步,异常也常常被称为同步中断。在处理器执行到错误指令时候(如除数为0),或者是在执行期间出现特殊情况(如缺页),这些异常需要通过内核来处理,处理器就会产生一个异常。中断还可以通过软中断实现系统调用。

二、中断处理程序

在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序(interrupt handler) 或中断服务例程(interrupt service routine,ISR)。每种类型的中断都有一个相应的中断处理程序。一个设备的中断处理程序是它设备驱动程序(driver)的一部分——设备驱动程序是用于对设备进行管理的内核代码

中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。

中断可能随时发生,因此中断处理程序也就随时可能执行。所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快地恢复中断代码的执行。

一般把中断处理切位两个部分:中断处理程序是上半部(top half)——接收到一个中断,上半部立刻开始执行,但只做有严格时限的工作,例如对接收的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的。能够被允许稍后完成的工作会推迟到下半部(bottom half)去。

三、注册中断处理程序

中断处理程序是管理硬件的驱动程序的组成部分。如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序。

驱动程序可以通过 request_irq() 函数注册一个中断处理程序(声明在 <linux/interrupt.h>),并且激活给定的中断线,以处理中断:

第一个参数 irq 表示要分配的中断号。

第二个参数 handler 是一个指针,指向处理这个中断的实际中断处理程序。只要操作系统一接收到中断,该函数就被调用。

注意 handler 函数的原型,它接受两个参数,并有一个类型为 irqreturn_t 的返回值。

第三个参数 flags 可以为 0,也可能是下列一个或多个标志的位掩码。定义在 <linux/interrupt.h>。其中最重要的几个标志是:

  • IRQF_DISABLED——该标志被设置后,意味着内核在处理中断处理程序本身期间,要禁止所有的其他中断。多数中断处理程序是不会设置该位,这种用法留给希望快速执行的轻量级中断。
  • IRQF_TIMER——该标志是特别为系统定时器的中断处理而准备的。
  • IRQF_SHARED——此标志标明可以在多个中断处理程序之间共享中断线。

第四个参数 name 是与中断相关的设备的 ASCII 文本表示

第五个参数 dev 用于共享中断线。当一个中断处理程序需要释放时,dev 将提供唯一的标志信息(cookie),以便从共享中断线的诸多中断处理程序中删除指定的那一个。如果无需共享中断线则设置为 NULL 即可。内核每次调用中断处理程序时,都会把这个指针传递给它。实践中往往会通过它来传递驱动程序的设备结构

request_irq() 函数成功执行会返回 0,非 0 值则代表有错误发生。

request_irq() 函数可能会睡眠,因此不能在中断上下文或其他不允许阻塞的代码中调用该函数。因为 kmalloc() 是可睡眠的。

四、卸载中断处理程序

卸载驱动程序时,需要注销相应的中断处理程序,并释放中断线。上述动作需要调用:

void free_irq(unsigned int irq, void *dev)

如果指定的中断线不是共享的,则删除处理程序的同时将禁用这条中断线。如果中断线是共享的,则删除 dev 所对应的处理程序,并不禁用中断线。

 

五、编写中断处理程序

以下是一个中断处理程序声明:

static irqreturn_t intr_handler(int irq, void *dev)

中断处理程序的返回值为 irqreturn_t。中断处理程序可能返回两个特殊的值:IRQ_NONE 和 IRQ_HANDLED。当中断处理程序检测到一个中断,但该中断对应的设备并不是在注册处理函数期间指定的产生源的时候,返回 IRQ_NONE。反之则返回 IRQ_HANDLED。

Linux 的中断处理程序是无需重入的。同一个中断处理程序绝不会被同时调用以处理嵌套的中断。

共享的处理程序的特点有:

  • request_irq() 的参数 flags 必须设置 IRQF_SHARED 标志。
  • 对于每个注册的中断处理程序来说,dev 参数必须唯一。指向任一设备结构的指针就是唯一的。
  • 中断处理程序必须能够区分它的设备是否真的产生了中断。

内核在接收一个中断后,它将依次调用在该中断线上注册的共享的处理程序,所以,一个处理程序必须知道它是否应该为这个中断负责,如果与它相关的设备并没有产生中断,那么处理程序应该立即退出。

六、中断上下文

当执行一个中断处理程序的时候,内核处于中断上下文(interrupt context)中。

进程上下文是一种内核所处的操作模式,此时内核代表进程执行。进程上下文可以睡眠,也可以调用调度程序,因为进程有 task_struct 结构,当进程再次被调度时能恢复进程执行环境。

中断上下文和进程没有什么关联,并且中断上下文是不可睡眠的,因为中断上下文没有某种结构记录它的执行状态,一旦睡眠就无法再被重新唤起了(没有东西来恢复它的执行环境),所以在中断上下文中不可使用信号量,因为信号量会导致睡眠。因为中断打断了其他代码的执行,所以中断上下文的代码应该简洁、迅速,尽量把工作从中断处理程序中分离出来,放到下半部执行。

procfs 是一个虚拟文件系统,它只存在于内核内存,一般安装于 /proc 目录。在 procfs 中读写文件都要调用内核函数。/proc/interrupt 文件存放系统中与中断相关的统计信息。

通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。锁提供保护机制,防止来自其他处理器的并发访问,而禁止中断提供保护机制,则是防止来自其他中断处理程序的并发访问。

禁止当前处理器上的本地中断,随后又激活它们的语句为:

local_irq_disable();
/* 禁止中断 */
local_irq_enable();

x86 上这两个函数是通过单个汇编指令实现的,cli 指令和 sti 指令。

但是上述用法并不安全,万一在调用 local_irq_disable() 之前中断就是关闭的,之后再调用 local_irq_enable()相当于无条件把中断打开了,所以为了更安全的关闭中断,我们使用如下方式:

unsigned long flags;

local_irq_save(flags); /* 禁止中断 */

local_irq_restore(flags)l /* 中断恢复到原来的状态 */

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/907208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uboot使用

一、uboot模式 自启动模式 uboot启动后若没有用户介入&#xff0c;倒计时结束后会自动执行自启动环境变量(bootcmd)中设置的命令&#xff08;一般作加载和启动内核&#xff09; 交互模式 倒计时结束之前按下任意按键uboot会进入交互模式&#xff0c;交互模式下用户可输入ub…

Handler及相关的理论知识

前言 学安卓的都接触过Handler&#xff0c;许多老java项目中也有很多使用Handler进行网络通讯&#xff0c;或许现在我们都用kotlin&#xff0c;用协程&#xff0c;但咱也不能就把Handler忘了&#xff0c;本篇文章特此巩固Handler相关知识 是什么 Handler主要用于异步消息的处…

Anaconda, Python, Jupyter和PyCharm介绍

目录 1 Anaconda, Python, Jupyter和PyCharm介绍 2 macOS通过Anaconda安装Python, Jupyter和PyCharm 3 使用终端创建虚拟环境并安装PyTorch 4 安装PyCharm并导入Anaconda虚拟环境 5 Windows操作系统下Anaconda与PyCharm安装 6 通过 Anaconda Navigator 创建 TensorFlow 虚…

Php“牵手”淘宝商品SKU信息数据采集方法,淘宝API接口申请指南

淘宝天猫商品属性sku信息接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片&#xff0c;销量&#xff0c;sku信息等信息。在电商平台的开发中&#xff0c;商品属性接口API是非常常用的 API&#x…

【HCIP】03.VLAN高级技术

Eth-trunk 链路聚合&#xff0c;定义出一个逻辑聚合口&#xff0c;把物理接口和逻辑接口关联&#xff0c;此时在STP中&#xff0c;会把多个物理接口看成一个逻辑接口&#xff0c;此时不会出现环路。 接口负载分担&#xff08;逐包|逐流&#xff09; 基于IP的散列算法能保证包…

Fast DDS (2)

1、结构&#xff1a; Fast DDS的架构如下图所示&#xff0c;可以看到以下不同环境的层模型&#xff1a; 应用层&#xff1a;利用Fast DDS API 在分布式系统中实现通信的用户应用程序。Fast DDS层&#xff1a;DDS 通信中间件的稳健实现。它允许部署一个或多个 DDS 域&#xff…

css 实现电梯导航

实现原理&#xff1a;利用css实现电梯导航很简单&#xff0c;基本原理就是通过a标签绑定跳转目标的id来实现的 html代码&#xff1a; <div class"body"><div class"top" id"top"></div><div class"con1" id"…

[Docker] Portainer + nginx + AList 打造Docker操作三板斧

Portainer : Docker容器图形化管理系统nginx: 反向代理利器AList: 文件管理系统 1. 安装 ##### portainer ##### # 拉取镜像 portainer 注: ce 社区版 ee 企业版 原项目(portainer/portainer)已弃用 docker pull portainer/portainer-ce # 运行容器 docker run -d --name por…

如何编写系统要求规范(SRS)文档

想象一下&#xff0c;你负责设计一座17层的大楼&#xff0c;但是蓝图丢失了。在没有这个关键文件的情况下&#xff0c;整个项目可能会因严重错误而处于风险之中。软件项目也有类似的情况&#xff0c;如果没有蓝图&#xff0c;你可能会生开发出缺乏必要软件功能并且与客户需求不…

【Apollo】阿波罗自动驾驶技术:引领汽车行业革新

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

Python爬取Google高清遥感瓦片地图

Python爬取Google高清遥感瓦片地图 这是一个能直接从Google地图服务下载瓦片地图的程序&#xff0c;非常稳定&#xff0c;只需要设置需要下载的左上角和右下角的经纬度坐标即可下载。当然总所周知的原因&#xff0c;下载google地图需要先打开梯子。 下面放上一个下载的高清遥感…

【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

目录 回溯算法一、什么是回溯算法1、基本思想&#xff1a;2、一般步骤&#xff1a; 二、题目带练1、全排列2、组合3、子集 三、公式总结 回溯算法 一、什么是回溯算法 回溯算法&#xff08;Backtracking Algorithm&#xff09;是一种解决组合问题、排列问题、选择问题等一类问…

Python“牵手”淘宝商品详情数据采集方法,淘宝API申请步骤说明

淘宝平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 淘宝API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问淘宝平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现淘宝平台的数据开…

Android开发基础知识总结(一)初识安卓Android Studio

一.基础理论知识 1.Linux相当于是地基。 MIUI&#xff0c;EMUI等操作系统&#xff0c;是基于安卓的改版——且裁掉了一部分Google的服务。 &#xff08;鸿蒙虽然是改版&#xff0c;但和安卓的架构基本上一致&#xff09; 2.Kotlin和Java都是JVM语言&#xff0c;必须先复习好…

Python数据分析实战-给定JSON格式的数据提取所需字段并转换为DataFrame(附源码和实现效果)

实现功能 给定JSON格式的数据提取所需字段并转换为DataFrame 实现代码 import pandas as pd import json# 假设给定的JSON数据已经存储在data变量中 data [{"title": "Data Source Adapter for Excel Sheets","project_code_url": "htt…

Mac下Jmeter安装及基本使用

本篇文章只是简单的介绍下Jmeter的下载安装和最基本使用 1、初识Jmeter 前一段时间客户端app自测的过程中&#xff0c;有偶现请求某个接口返回数据为空的问题&#xff0c;领导让我循环100次请求这个接口&#xff0c;看看有没有结果为空的问题。听同事说有Jmeter的专业测试工具…

Java数据结构学习和源码阅读(线性数据结构)

线性数据结构 链表 LinkList 链表的数据结构 一组由节点组成的数据结构&#xff0c;每个元素指向下一个元素&#xff0c;是线性序列。 最简单的链表结构&#xff1a; 数据指针&#xff08;存放执行下一个节点的指针&#xff09; 不适合的场景&#xff1a; 需要循环遍历将…

【C++】 使用红黑树模拟实现STL中的map与set

文章目录 前言1. 对之前实现的红黑树进行一些补充和完善1.1 析构1.2 查找 2. STL源码中map和set的实现3. 改造红黑树封装map和set3.1 红黑树结构修改3.2 map、set的结构定义3.3 insert的封装3.4 insert测试3.5 发现问题并解决3.6 红黑树迭代器实现3.7 封装set和map的迭代器并测…

uniapp scroll-view横向滚动无效,scroll-view子元素flex布局不生效

要素排查&#xff1a; 1.scroll-x属性需要开启&#xff0c;官方类型是Boolean&#xff0c;实际字符串也行。 2scroll-view标签需要给予一个固定宽度&#xff0c;可以是百分百也可以是固定宽度或者100vw。 3.子元素需要设置display: inline-block&#xff08;行内块元素&#x…

国标GB28181视频平台EasyGBS通过对应密钥上传到其他平台展示的详细步骤来啦!

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…