• Linux实现中断处理

内核是怎么知道应用程序要调用系统调用的呢?或者说应用程序怎么通知系统内核自己需要执行一个系统调用,这是通过软中断实现的,通过引发一个异常来促使系统切换到内核态去执行异常处理程序

PS:什么时候会从用户态切换到内核态呢?1.中断;2.陷阱;3.系统调用

中断分为两种,硬中断和软中断;

在许多处理器体系结构处理异常和处理中断的方式类似,为了助于理解,可以把异常想象成软中断,我们通常说的中断是硬中断,硬中断是由硬件引起而不是软件引起的

每一种中断都有一个对应的中断处理程序,如果一种中断设备可以产生多种中断,那这个中断设备就有多个中断处理程序对应,而一个中断处理程序就是该设备对应的设备驱动程序中的一部分

我们想让中断处理程序运行的快,还想让中断处理程序多干活,显然是有冲突的,所以我们把中断程序分为两个部分,中断处理程序是上半部分,能够被允许稍后完成的工作会推迟到下半部去(注意!在执行中断上半部分的时候,是不允许产生其他中断的,所以设置标志位IRQF_DISABLED

举个栗子:拿我们可爱的网卡来说事情吧,例如网卡从网上收集了很多数据包,于是我们的朋友网卡君就通知内核,嘿,我这来了一批新货,要看看么,于是内核屁颠屁颠的去处理了(调用中断处理程序)中断开始执行,通知硬件开始拷贝数据(从网卡到内存),这件事是很紧迫的,因为网卡有一定的缓存,超过缓存这家伙就不干活了(丢弃数据包),为了压榨网卡(让他好好干活),内核必须尽快处理这件事情,而且这件事情是硬件相关的(就是和网卡脱不了干系),没了网卡干不了,不能延后,拷贝完这些数据包之后的事情就可以放到下部分了,于是内核忙完了,又去处理刚才被中断的进程了

  • 中断处理程序标志

IRQF_DISABLED——在执行当前中断处理程序的时候,禁止所有其他的中断(野蛮!!尽量给想要尽快运行的轻量级中断使用)

IRQF_SAMPLE_RANDOM——表明这个设备的中断对内核熵池有贡献

  PS:内核熵池负责提供从各种随机事件导出真正的随机数,就是说中断啥时候来(随机的),有个中断产生速率(自然也随机了),就拿去扔池      子里产生随机数用了。。。和中断关系似乎不是很大

IRQF_TIMER——专门为系统定时器的中断处理而准备的

IRQF_SHARED——共享中断线,中断线可以理解为中断单独对着的一个号,同时一个号可以对应多个终端

  • 中断和锁之间不得不说的那些事儿

这里简单的把锁分为两类,自旋锁和睡眠锁(当然对应着很多具体的锁),分为两类是因为,自旋锁是可以用于中断(争用该锁会导致忙循环)的,但是拥有睡眠性质的锁是不能用于中断(争用该锁会导致睡眠),只能用于进程。我们之前说了,中断处理程序的上半部分是很紧迫的,这么紧迫的事情你怎么可以去睡眠偷懒呢?!哪怕现在轮不到你,你也得给我等着!

为什么不能让中断睡眠?因为睡眠是为了进程调度存在的,但是中断处理程序一旦睡眠不仅没有时间可以唤醒中断处理程序,而且无法调度,因为进程有个进程号,但是中断没有,一旦当前的中断处理睡眠了,没有其他的东西会获得处理器,而且中断处理永远不会被唤醒,那么系统就会瘫痪

一定要在获取锁之前,禁止本地中断!!!为啥呢?见下图

欲知下半部分如何,且听下回分解

Linux内核实现中断和中断处理(一)的更多相关文章

  1. Linux内核实现中断和中断处理(二)

    第一部分移步传送门召唤!!:http://www.cnblogs.com/lenomirei/p/5562086.html 上回说了Linux内核实现中断会把中断分为两部分进行处理,上回讲了上部分,这 ...

  2. 再思linux内核在中断路径内不能睡眠/调度的原因(2010)【转】

    转自:http://blog.csdn.net/maray/article/details/5770889 Linux内核中断路径中不能睡眠,为什么? 这里就行了很深入的讨论,值得一看:http:// ...

  3. 深入理解Linux内核-中断和异常

    Linux内核代码查看 http://androidxref.com/ 中断:被定义位一个事件,它能改变处理器执行指令的顺序.它对应硬件(CPU.其他硬件设备)电路产生的电信号. 同步中断:指令执行时 ...

  4. Linux内核分析-分析system_call中断处理过程

    姓名:江军 ID:fuchen1994 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shi ...

  5. 理解Linux内核之中断控制

    乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...

  6. Linux 内核PCI 中断

    对于中断, PCI 是容易处理的. 在 Linux 启动时, 计算机的固件已经分配一个唯一的中 断号给设备, 并且驱动只需要使用它. 中断号被存储于配置寄存器 60 (PCI_INTERRUPT_LI ...

  7. Linux内核分析——分析system_call中断处理过程

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我选择的是get ...

  8. linux内核对中断的处理方式

    中断取代了轮询的通知方式,DMA取代了轮询的读写数据方式. 分类软件指令造成的中断(又叫异常,同步中断).    svc, und, abt硬件通过中断请求信号造成的中断(异步中断).  irq,fi ...

  9. Linux 内核中断内幕

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...

随机推荐

  1. java io流 数据流传输

    java io流 数据流传输 把这段当公式用就可以了 //数据流传输 import java.io.*; public class Index{ public static void main(Str ...

  2. JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

    从http://www.open-open.com/lib/view/open1434377191317.html 转载 Java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WE ...

  3. MYSQL C API : mysql_real_escape_string 二进制数据存储

    #include <iostream> #include <string> #include <string.h> #include <mysql.h> ...

  4. Sql语句查看表结构

    快速查看表对的就说明,及表字段描述及字段类型 --表描述 SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties ds LEFT JOI ...

  5. java几种常见加密算法小试

    http://www.cnblogs.com/JCSU/articles/2803598.html http://www.open-open.com/lib/view/open139727425732 ...

  6. 70. Implement strStr() 与 KMP算法

    Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haysta ...

  7. python 向上取整ceil 向下取整floor 四舍五入round

    #encoding:utf-8 import math #向上取整 http://www.manongjc.com/article/1335.html print "math.ceil--- ...

  8. SQL笔记 [长期更新] (-2015.4)

    [遍历所有表,复制表结构,复制表数据] --插入语句SELECT * INTO A FROM B 是在还没有A表的情况下,直接通过B表创建并把B表数据复制到A表里面,之后A,B表的结构和数据完全一样. ...

  9. java中常用数据类型转换器

    /** * 把String转换成long * * @param src 要转换的String * @param def 转换失败时返回此值 * @return 转换好的long */ public s ...

  10. 用vector容器代替数组 ——使用数组初始化vector对象

    在C++中,我们不能用数组直接初始化另一数组,而只能创建新的数组,然后显式的把原数组的元素逐个复制给新的数组. 按照C语言中的做法: const size_t arry_size=6; int int ...