本文转载自【微信公众号:机械猿,ID:on_ourway】经微信公众号授权转载,如需转载与原文作者联系

基本概念

中断是指CPU在执行程序时,由于内外部事件或由程序预先安排的事件,导致CPU 暂停当前程序,转而处理突发事件,服务完毕后CPU再返回继续运行被暂时中断的程序。中断可分为内部中断和外部中断。内部中断来自CPU内部(除0错误、溢出等),外部中断来自外设,如时钟芯片等。

根据中断入口跳转方法的不同,可将中断分为向量中断和非向量中断。实现向量中断的CPU会为不同中断分配不同的中断号,当检测到某中断到来时,会自动跳到该中断号对应的地址执行。而非向量中断会是所有中断共用一个地址入口,中断到来时,进入该地址,然后通过中断标志来识别具体是哪个中断,也就是会进行二次跳转。改写向量表(RAM区)中的函数地址,就实现了中断向量重定向。

ARM嵌入式系统芯片和X86芯片基本都包含可编程中断控制器(PIC),通过读写PIC的寄存器可以屏蔽、使能某个中断或者获取中断状态。

Linux中断处理架构

因为中断会打断进程的正常调度和运行,因此要求中断程序尽可能短小。那么对于复杂耗时的任务,就需要实现一个实用的中断处理机制了。Linux将中断程序分为两部分:上半部和下半部,上半部完成比较紧急的功能,一般只是登记寄存器中的中断状态并清除中断标志,然后将该中断对应的下半部程序挂到执行队列中去。

举个例子,像VxWorks的网络驱动,一般包接收中断到来后,会通过isr_irq()函数释放信号量,然后dsr_irq()被唤醒,执行包的读取工作。当然信号量的操作需要锁保护。

Linux中断编程

1、申请和释放中断

使用request_irq将终端号与具体的中断(上半部)回调函数对应起来,可以设置中断触发方式,如电平触发和边沿触发。对应的释放函数是free_irq。使用方法与socket的申请释放类似。

2、使能和屏蔽中断

disable_irq可以屏蔽一个中断源,这里注意使用的时候不用引起系统死锁。对应的恢复函数为enable_irq。

3、下半部机制

下半部处理机制包括软中断、tasklet、workqueue、中断线程化,用于任务调度的PendSV就是典型的软中断。这里工作队列位于进程上下文,因此其处理函数中允许睡眠,而软中断和tasklet运行于中断上下文,是原子执行的,其处理函数不能睡眠。

可以看到异步通知中的信号(SIGNAL)机制也类似于中断,其与中断区别是:硬中断是由外设对CPU的中断,软中断是中断后半部的处理机制,信号是内核(or进程)对进程的中断。在系统调用场景下会说通过软中断(SWI、BKPT指令陷入内核,那么这里的软中断是指软件指令引发的内核状态切换(如ARM从用户态切到内核态),与软中断不是同一个概念。

那么系统调用是不是中断?不是。系统调用是只是CPU从用户态切入内核态(通过TRAP指令),是CPU模式切换,并不是进程上下文切换,即系统调用、中断不等于进程调度,系统调用会将用户上下文即esp寄存器等压入进程空间的内核栈。(进程切换的时候,用户态的寄存器信息会保存在task_struct内,即PCB,位于内核空间,可以看一下之前写的:嵌入式操作系统的任务调度)当系统调用或中断处理程序返回时,CPU要从内核模式切换回用户模式,此时会执行操作系统的调用程序。如果发现就绪队列中有比当前进程更高的优先级的进程,则会发生进程切换:当前进程信息被保存,切换到就绪队列中的那个高优先级进程;否则,直接返回当前进程的用户模式,不会发生上下文切换。像fork等与进程操作相关的系统调用一般就会引起进程调度。

每个进程都拥有两个堆栈:用户空间的堆栈和内核空间堆栈

用户进程:执行用户空间的代码的程序,使用用户堆栈

系统进程:执行内核空间代码(系统调用或中断)的程序,使用内核堆栈(系统堆栈)

系统调用一般会调用到copy_from_user和copy_from_user来执行将用户空间与内核空间数据拷贝,如前文:简单讲讲文件系统中f_op的read、write等。

举报/反馈

linux 中断 应用程序,Linux中断编程相关推荐

  1. linux中断初始化程序,Linux x86_64 内核中断初始化

    Linux x86_64 内核中断初始化 中断分类 Linux 系统中, 中断分为: 硬中断: 由外部设备或者执行异常产生的需要快速处理的中断如缺页中断定时器硬件中断 根据内部产生还是外部产生, 分为 ...

  2. linux连接到程序,Linux下C程序的链接过程

    今天看到一个很有意思的小程序,它让我对Linux下C程序的编译链接有了一个全新的认识! 这个程序的就是写一个简单的输出"hello World!": 要求:1.不使用C运行库,写一 ...

  3. linux 查找某个程序,Linux查找特定程序whereis实例详解

    Linux 查找特定程序 whereis whereis 命令主要用于查找程序文件,并提供这个文件的二进制可执行文件.源代码文件和使用手册存放位置. 1.查找命令程序 例如,查找 touch 命令 [ ...

  4. linux亮度调节程序,linux调节屏幕亮度

    新建三个文本文件并给予执行权限: up.sh if [ ! -w /sys/class/backlight/intel_backlight/brightness ];then echo "p ...

  5. 怎么开发Linux图形界面程序,Linux下的图形界面编程

    Linux下的图形界面编程 一.Qt和GTK+ 虽然Linux下的大多数开发是基于字符界面的,但在Linux环境下也可以开发出美观大方的图形界面.经过多年的发展,目前已经存在多种用于在Linux下开发 ...

  6. linux文件读取程序,Linux系统编程:文件的读取写入

    一.read系统调用 一旦有了与一个打开文件描述相关连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型: ssize_t ...

  7. 嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网

    有许多网络文件下载工具可以在Windows平台下很好地工作,如NetAnts."网际快车".TelePro等,还有像WebZip那样功能强大的离线浏览器.这些工具使我们可以在Win ...

  8. linux服务端 程序,linux服务端程序tunning过程简要总结

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 步骤1:网络丢包的原因定位 ethtool -S eth0 rx_dropped代表丢包发生在linux 内核缓冲区,丢 ...

  9. Linux加法简单程序,Linux操作之——简单命令

    目录 bash pstree type:显示命令的类型 Help:help (命令名)(参数) Man(manual):man(命令名)(参数) Whereis:whereis (文件名)(参数) F ...

最新文章

  1. VS Code 安装 Go 插件、自定义扩展配置、断点调试
  2. 金融行业安全漏洞分析报告
  3. 【翻译】关于回调地狱
  4. img should be PIL Image. Got <class ‘numpy.ndarray‘>
  5. redis java对象操作
  6. python3编译器怎么下载_Python编译器及Sublime Text3安装及开发环境配置
  7. 言有三新书预售,不贵,有料
  8. 计算机组装的维修学测,《计算机组装与维修》课程学业水平测试卷(样卷答案).doc...
  9. html egg mac os 10.7,HTML Egg
  10. zbb20190528 城市经纬度json
  11. [JSP暑假实训] 一.MyEclipse安装及JAVA基础知识
  12. SpringMVC日期类型转换问题处理方法归纳
  13. 集成学习之Adaboost(提升方法)
  14. [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入hive
  15. csu 最优对称路径(bfs+记忆化搜索)
  16. 属马的人性格有什么缺点和优点?
  17. Configuring SharePoint 2010 and ADFS v2 End to End-摘自网络
  18. android简单记账软件,简洁记账app
  19. 找回QQ很久以前删除过的QQ好友
  20. 支付宝小程序悬浮按钮

热门文章

  1. java难度_你们觉得java难吗?
  2. python保存数据db_python存储数据到mongodb
  3. 内网通不用软件改积分_软件项目为什么不能够如期交付?
  4. 计算机操作系统教程讲解视频,计算机操作系统(54集)全套教学视频
  5. c语言程序装萝卜,萝卜花园练习win7系统安装SkyDrive的图文步骤
  6. 删除Terminating状态的Pod
  7. JavaScript PopUp生成器
  8. 几点减几点怎么列算式_节日礼品怎么挑选 这几点很关键
  9. 怎么把竖列中的数相加python_关于python中pandas.DataFrame对行与列求和及添加新行与列示例代码...
  10. ctf wav文件头损坏_【CTF入门第二篇】南邮CTF web题目总结