博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux学习---中断和中断处理
阅读量:2177 次
发布时间:2019-05-01

本文共 2030 字,大约阅读时间需要 6 分钟。

中断和中断处理

处理器的速度和外围设备的速度相差太远,为了解决让内核不做过多的无用功(使用轮询),这是就需要一种机制在硬件需要时再向内核发出信号(中断机制)
中断机制可以更好的协同处理器和外部设备,并且提高机器的性能

1、中断

中断:指的是可以使得硬件得以发出通知给处理器,中断可以随时产生(硬件设备再产生中断的时候并不会去考虑和处理器的时钟同步)。

如:敲击键盘时,键盘控制器会发送一个中断,通知操作系统有键按下
中断本质:一种特殊的电信号,由硬件设备发向处理器,处理器收到后会将信号反应到操作系统,然后由操作系统处理新到来的数据(中断信息)
中断流程:硬件设备----->中断控制器------>处理器------>操作系统
硬件设备:负责产生,每个中断都通过一个唯一的数字标志
中断控制器用于收集硬件设备的中断信号(采用的多入口单出口的设计),收到后会发送信号到cpu,一个出口连接cpu,
处理器:当收到信号后会中断当前工作,去处理中断
操作系统:cpu会通知操作系统,然后操作系统会对操作系统进行适当的处理

异常

中断和异常不同,异常在产生时必须考虑与处理器时钟同步。异常通常称为同步中断

异常的产生:编程失误错误指令(段错误等)或者执行时缺页等特殊情况,必须靠内核处理,cpu就会产生一个异常
cpu的处理异常和中断的方式类似,因此内核对他们的处理也类似

2、中断处理程序

中断处理程序:在响应一个特定中断的时候,内核会执行的函数

产生中断的每个设备都有一个相应的中断处理程序,中断处理程序不是和特定的设备关联而是和特定中断关联,即一个设备可以产生多种不同中断
中断处理程序和其他内核函数的区别:中断处理程序是被内核调用来响应中断的,运行于我们称之为中断上下文(原子上下文,上下文中的执行代码不可阻塞)

2.1、注册中断处理程序

每一设备都有相关的驱动程序,如果使用中断,相应的驱动程序就注册一个中断处理程序,通过request_irq()函数注册中断处理程序,并激活给定的中断线

request_irq(unsigned int irq, irq_handler_t handler,  unsigned ling flags,  const char *name,  void *dev)
  • 第一个参数irq 表示要分配的中断号,要么通过探测获取,要么通过编程动态确定
  • 第二个参数handler是一个指针(函数指针),指向中断的实际中断处理程序typedef irqreturn_t (*irq_handler_t) (int, void*)
  • 第三个参数中断处理程序标志
  • 第四个参数name是与中断相关的设备的ASCII文本表示
  • 第五个参数dev用于共享中断线。当一个中断处理程序需要释放时,dev将提供唯一的标志信息,以便从共享中断线的诸多中断程序中删除指定的哪一个。
    request_irq()成功执行会返回0,非0表示错误发生,指定的中断处理程序不会被注册,最长见的错误是-EBUSY,它表示给定的中断线已经在使用
    注意:request_irq函数可能会睡眠,因此不能再中断上下文或其他不允许阻塞的代码中调用该函数

2.2、中断处理程序标志

  • IRQF_DISABLED -----该标志被设置后,意味着内核在处理中断处理程序本身期间,要禁止所有的其他中断。如果不设置,中断处理程序可以与除本身外的其他任何中断同时运行
  • IRQF_SAMPLE_RANDOM ------此标志表明这个设备产生的中断对内核熵池有贡献。如果指定了该标志那么来自该设备的中断间隔时间就会作为熵填充到熵池
  • IRQF_TIMER ----- 该标志是特别为系统定时器的中断处理而准备的
  • IROQF_SHARED ----- 此标志表明可以在多个中断处理程序之间共享中断线。在同一个给定线上注册的每个处理程序必须指定这个标志;否则在每条线上只能有一个处理程序
    内核熵池:负责提供从各种随机事件导出真正的随机数

3、上半部和下半部的对比

为什么有上下两部分:因为我们既想中断处理程序运行得快,又想中断处理程序完成的工作量多,二者是矛与盾的关系,因此将中断处理程序切分为两个部分

上半部分:接收到一个中断,立即开始执行,但只做有严格时限的工作
如:对接收的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的
下半部分:能够被允许稍后完成的工作会推迟到下半部去做。
上下不放呢分割的例子:
网卡:网卡接收数据----->通知内核数据包到了,网卡需要立即处理以避免超时
网卡发出中断---->内核----->执行网卡注册的中断处理程序作出响应----->中断开始执行---->通知硬件拷贝数据到内存

为什么需要实时拷贝到内存:	防止阻塞,因为网卡的缓存固定相对于内存国小,拷贝到内存时中断的任务就完成了即上半部分的工作完成;	数据包的处理就是下半部分要做的事情。

转载地址:http://dcfkb.baihongyu.com/

你可能感兴趣的文章
Chrome开发者工具
查看>>
【LEETCODE】102-Binary Tree Level Order Traversal
查看>>
【LEETCODE】106-Construct Binary Tree from Inorder and Postorder Traversal
查看>>
【LEETCODE】202-Happy Number
查看>>
和机器学习和计算机视觉相关的数学
查看>>
十个值得一试的开源深度学习框架
查看>>
【LEETCODE】240-Search a 2D Matrix II
查看>>
【LEETCODE】53-Maximum Subarray
查看>>
【LEETCODE】215-Kth Largest Element in an Array
查看>>
【LEETCODE】241-Different Ways to Add Parentheses
查看>>
【LEETCODE】312-Burst Balloons
查看>>
【LEETCODE】232-Implement Queue using Stacks
查看>>
【LEETCODE】225-Implement Stack using Queues
查看>>
【LEETCODE】155-Min Stack
查看>>
【LEETCODE】20-Valid Parentheses
查看>>
【LEETCODE】290-Word Pattern
查看>>
【LEETCODE】36-Valid Sudoku
查看>>
【LEETCODE】205-Isomorphic Strings
查看>>
【LEETCODE】204-Count Primes
查看>>
【LEETCODE】228-Summary Ranges
查看>>