• 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. linux查看磁盘io的几种方法

    怎样才能快速的定位到并发高是由于磁盘io开销大呢?可以通过三种方式: 第一种:用 top 命令 中的cpu 信息观察 Top可以看到的cpu信息有: Tasks: 29 total, 1 runnin ...

  2. [HTML] CSS 渐变

    CSS3 渐变 CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使用图像来实现这些效果.但是,通过使用 CSS3 渐变(gradients),你可以 ...

  3. Monty Hall Problem的一个图解,感觉不错

    从Coursera.org上的台大概率课讨论组里拿来的 如果不转换,选中汽车的概率是1/3,非常显然. 但转换后选中汽车的概率变成2/3就有点反直觉了,并不是太容易想明白. 因为转换其实有4种:汽车- ...

  4. C++标准转换运算符

    C++类型转换在实际编程中会经常使用,其实,本质上对象的类型用来解释(interpret)对象.因为,每个对象都占据一块内存空间,这块内存空间存放了一段二进制数据.通过标记该对象的类型,告诉如何看待这 ...

  5. C++中的RTTI机制解析

    RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...

  6. 学习java第7天

    关于继承还需要留意的是,子类中的所有构造方法都默认访问父类的无参构造,注意是无参,而且是必须的,如果父类没有无参子类就会报错.如果你不想给父类无参构造,那么在子类中加上super(),显式的调用有参构 ...

  7. mysql批量执行sql文件

    1.待执行的sql文件为1.sql.2.sql.3.sql.4.sql等 2.写一个batch.sql文件: source .sql; source .sql; source .sql; source ...

  8. cs0006 未能找到元数据文件 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

    翻阅了一些资料后发现是需要重新注册IIS服务扩展,在“开始”-“运行”里输入如入命令,回车,搞定 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspne ...

  9. Func的介绍

    经常看到  Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Func<int,bool>的Func转到定义看它的解 ...

  10. linux配置的问题

    1 从系统设置-文本设置中把双拼删掉 2 通过sudo passwd root 修改root密码 3 通过su获取root权限 4 通过sudo pppoeconf输入宽带帐号密码 5 把更新源修改成 ...