中断与异常详解(五)

随着看的东西的增多,之前不明白的地方也开始有了眉目,所以更新前几节的东西,欢迎指正。想想马上就中断返回,进入进程描述了,还是挺激动的呢。

不得不推荐一篇写得很好的文章《spinlock的剖析与改进》

http://www.searchtb.com/2011/06/spinlock%E5%89%96%E6%9E%90%E4%B8%8E%E6%94%B9%E8%BF%9B.html

中断向量表多达256项

  虽然默认使用的只有49条,但很明显中断服务程序必须支持SMP,这也是在第三节为什么在 handle_IRQ_event(irq, &regs, action);对中断进行实际处理之前会放弃多cpu锁,那么这段代码自然就是多cpu可重入的了。但因为action是在有多cpu锁的状态下获得的,所以就只会有一个获取成功的cpu去响应这条中断线。

软中断向量表只有32项

  默认只是用了4项,并将2.4之前版本的bh机制封装到了0号软中断线上。

两者其实有很多共通的地方

  中断前半部分分为32项cpu内部异常,与224项外部硬中断。

  其中0-31号cpu内部异常直接由自身处理了,不需要对中断线进行管理,因为中断线是多cpu共享的公共资源。

  32-225号硬中断线则是公共资源,需要每个cpu先去获得处理权限,才能对中断线上的中断请求予以响应。

  同样的软中断向量表也是公共资源,其设计初衷更理想,每个cpu不用申请就可以直接去处理,但这对代码设计要求太高,所以才有tasklet机制去限制。

bh_task_vec[32]跟硬中断线很像

  设计为任意时刻每个bh_task_vec最多只能跑在一个cpu上,但多个cpu可以跑多个bh_task_vec。硬中断线通过锁cpu,关中断来保证一个cpu只能响应一条硬中断线,多个cpu可以响应多条中断线,中断线不被重复申请;而tasklet机制通过对tasklet_struct结构体中的state状态量标记是否已被调度来保证每个bh_task_vec在任意时刻只能被调度到一个cpu的0号软中断服务队列中,多个cpu有多个0号软中断服务队列,两种不同的处理方式实现了同样的公共资源分配与共享。

  硬中断线是在获得多cpu锁的情况下获取中断服务队列并执行,所以多个cpu竞争这把自旋锁,谁获得锁谁就响应;而tasklet机制是在获得tasklet_struct中的调度权限之后将bh_task_vec调度到某个cpu并执行,所以多个cpu竞争的是调度权限,谁有调度权限谁就拿走这个bh_task_vec(不是真正的取走,只是链接过去而已)。

这种同步模型可以总结为n:n生产者-消费者问题

  多个生产者产生多种中断请求,单个生产者不允许重复产生,就关了单个生产者的中断线,多个消费者竞争响应中断,可以理解为所有消费者都接到了通知,但需要在一个全局锁中去拿中断服务队列,拿不到的就各回各家,拿到就响应。全局锁在硬中断中就是多cpu锁,在tasklet中就是每个tasklet_struct中的调度权限。

不理解的地方归纳如下:

  1、中断嵌套到底是个何其神奇的东西?怎么发生的?硬中断线上的8个状态到底如何改变,对应什么状态?

  2、每个cpu的状态数据结构中断的软中断缓存任务有何作用?Tasklet_struct中的state状态量的TASK_STATE_RUN状态有何作用,获取这把锁失败时候重新调度是几个意思?没想明白tasklet_trylock(t)失败之后的流程。

  3、spinlock自旋锁的汇编,因为源代码中要穿插其他节的东西,而且编译之后有变化,所以理解困难。

  4、看见多处对eflags进行保存,用意何在?

还有很多,有空再说。

中断返回

ret_from_intr, ret_from_exception, ret_from_sys_call根据之前压栈的EFLAGS和CS段信息先去判断是否需要返回用户态,其中ret_from_sys_call需要再关一次中断,并重新调度进程,看是否有信号等待处理,最终返回。

如果ret_from_sys_call,不调度,没有信号量,不就直接RESTORE_ALL了?那在哪儿开中断呢?

时间: 2024-08-08 09:28:02

中断与异常详解(五)的相关文章

中断与异常详解(二)

中断或异常发生之前 当 CPU 执行了当前指令之后,CS 和 EIP 这对寄存器中所包含的内容就是下一条将要执行 指令的逻辑地址.在对下一条指令执行前,CPU 先要判断在执行当前指令的过程中是否发生 了中断或异常. 如果发生了一个中断或异常 那么 CPU 将做以下事情 • 确定所发生中断或异常的向量i(在 0-255 之间). • 通过 IDTR 寄存器找到 IDT 表,读取 IDT 表第i项(或叫第i个门). • 分两步进行有效性检查:首先是“段”级检查,将 CPU 的当前特权级 CPL(存放

中断与异常详解(三)

再次梳理会用到的一些数据结构和名词 中断向量表(中断描述符表) idt_table 全局,8字节64位,从低到高位16位段选择符,32位偏移量,16位状态信息 256项 起始地址在内核数据节的idt中 用于寻找各种门,门的作用是防止用户程序访问陷阱门.中断门等特殊资源,出于安全考虑,linux为用户留有3,4,5,128号系统调用门供用户使用 中断描述符表寄存器 IDTR 寄存器,6字节48位,低16位界限,高32位基址 1项 用于快速寻找中断描述符,linux定义的16位界限为8*256-1,

java异常详解

1. java中throw和throws:throw用在方法内部实际抛出异常的时候:throws用在方法头部(参数后面,方法体前面). public class Test{ public static void main(String[] args) { try { f(); } catch(NoSuchMethodException e) { System.out.println("test2"); } //用try-catch捕获并处理之后,后面的语句可以正常执行 System.o

.NET DLL 保护措施详解(五)常规条件下的破解

为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密算法的密钥及数据库字符串. 反编译: 我这里使用了.net dll反编译工具ILSpy,以下为真实截图. 1. NetProtect.BLLDemo.dll 2. NetProtect.ConsoleApplication1.exe 3. NetProtect.CoreClr.dll 综合上图,可以

一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/ 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: [csharp] view plaincopy #import <UIKit/UIKit.h> @interface TextViewController : UIViewController <UITextViewDelegate> { UITe

转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模式. 今天为在Windows下建立PHP开发环境,在考虑下载何种PHP版本时,遭遇一些让我困惑的情况,为了解决这些困惑,不出意料地牵扯出更多让我困惑的问题. 为了将这些困惑一网打尽,我花了一下午加一晚上的时间查阅了大量资料,并做了一番实验后,终于把这些困惑全都搞得清清楚楚了. 说实话,之所以花了这么

java笔记--异常详解与处理

一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出.     2.只有此类或其子类才可以是catch字句中的参数类型.     3.有两个直接子类:Error和Exception         Error--指应用程序不应该去处理捕获的一种严重问题,常表示系统级的错误,如内存溢出        Exception--指程序需要捕获,需要处理的异常,是一种设计或实现方面的问题.  

Android基础入门教程——8.3.8 Paint API之—— Xfermode与PorterDuff详解(五)

Android基础入门教程--8.3.8 Paint API之-- Xfermode与PorterDuff详解(五) 标签(空格分隔): Android基础入门教程 本节引言: 好的,上一节中,我们又写了一个关于Xfermode图片混排的例子--擦美女衣服的Demo,加上前面的 利用Xfermode来实现圆角或圆形ImageView,相信大家对Xfermode已经不再像以前那么陌生了,或者 说有点熟悉了,嗯,本节我们来写Xfermode的最后一个例子,通过Xfermode的ProterDuff.

Kafka详解五、Kafka Consumer的底层API- SimpleConsumer

Kafka提供了两套API给Consumer The high-level Consumer API The SimpleConsumer API 第一种高度抽象的Consumer API,它使用起来简单.方便,但是对于某些特殊的需求我们可能要用到第二种更底层的API,那么先介绍下第二种API能够帮助我们做哪些事情 一个消息读取多次 在一个处理过程中只消费Partition其中的一部分消息 添加事务管理机制以保证消息被处理且仅被处理一次 使用SimpleConsumer有哪些弊端呢? 必须在程序