Linux中断机制(2) - 北大深圳研究院.ppt_第1页
Linux中断机制(2) - 北大深圳研究院.ppt_第2页
Linux中断机制(2) - 北大深圳研究院.ppt_第3页
Linux中断机制(2) - 北大深圳研究院.ppt_第4页
Linux中断机制(2) - 北大深圳研究院.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux中断机制 2 软中断 梁冰北大网络分布式实验室2004 11 15 1 软中断简介 回忆前面的知识硬中断最后的处理do IRQ 函数中 最后的一个处理是什么 do softirq 为什么要软中断 硬中断中是需要尽快响应和处理的 不能将太多时间放在中断事件的处理上 否则会丢失掉另外的相同类型的中断一些中断需要处理的工作不是那么急迫硬件中断打断CPU 软中断打断内核序列 2 软中断分类 Linux2 4 系列有三种可延迟中断内核函数 软中断 softirq 小任务 tasklet 下半部分 bottomhalf 三者之间关系Tasklet用softirq实现 bottomhalf用tasklet实现 3软中断 tasklet及下半部 软中断非动态分配 需要内核编译同类软中断可以并发运行在几个CPU上Tasklet可以编程时动态分配 内核运行时 模块载入不同种类的taskelt可以并发在接个CPU上运行 同种的不行下半部分非动态分配 需要内核编译下半部分不能并发在几个CPU上运行注意任何可延迟函数都不能与其他的可延迟函数在同一个CPU上交错执行 3 1可延迟函数的一般操作 初始化 Initialization 定义一个新的可延迟函数激活 Activation 标记一个可执行函数成为pending态激活可以在任何时候进行 中断处理中也可 屏蔽 Masking 有选择地屏蔽一个可延迟函数 使它即使被激活也不会被内核执行执行 Execution 执行一个可延迟函数和其他任何的可延迟函数给定CPU激活的可延迟函数一般在同一CPU上运行 4可延迟函数 软中断详解 在2 4 内核中 定义了4种软中断低下标意味着高优先级 软中断函数从下标0开始执行 4 1软中断主要数据结构 Softirq vec数组由softirq action结构体组成的数组 默认内核只有前4项有用 structsoftirq action void action structsoftirq action void data 4 1软中断主要数据结构 Irq stat是irq cpustat t数组 每一个CPU一个 其实在硬中断处理部分已经使用了其中的许多数据项了 typedefstruct unsignedint softirq pending unsignedint local irq count unsignedint local bh count unsignedint syscall count structtask struct ksoftirqd task waitqueueistoolarge unsignedint nmi count archdependent cacheline alignedirq cpustat t 4 1软中断数据结构 Irq cpustat t softirq pending字段存放一组标志表示挂起的软中断 local bh count字段 禁止软中断的执行 为0则软中断被激活 为负数则被禁止 ksoftirq task字段 存放ksoftirqd CPUn内核线程的进程描述符 这种内核线程致力于可延迟函数的执行 4 2软中断的相关调用 初始化open softirq 函数处理软中断的初始化 三个函数分别是软中断下标 要执行的软中断的激活 cpu raise softirq宏激活cup raise softirq函数激活 同时唤醒ksoftirq CPUn内核线程 4 2软中断的相关调用 屏蔽 local bh count为0时打开软中断 为负 正 数时禁止执行检查软中断的挂起是在内核代码的几个点上进行的 且挂起点的个数和位置随内核版本的变化而改变 以下以2 4 内核为例 当local bh enable宏重新接活软中断时当do IRQ完成时处理I O的中断时当smp apic timer interrupt函数完成了处理一个本地时钟中断时一个特定的ksoftirq CPU内核线程被唤醒时当在网络接口卡上获取一个数据包时 4 2软中断的相关调用 关键代码 asmlinkagevoiddo softirq intcpu smp processor id u32pending unsignedlongflags u32mask if in interrupt return 4 2软中断的相关调用 local irq save flags pending softirq pending cpu if pending structsoftirq action h mask pending local bh disable 4 2软中断的相关调用 restart Resetthependingbitmaskbeforeenablingirqs softirq pending cpu 0 local irq enable h softirq vec do if pending 4 2软中断的相关调用 local irq disable pending softirq pending cpu if pending 4 2软中断的相关调用 几点注意及解释 可延迟函数 软中断 必须在中断之外运行 否则就违背初衷了 如果可延迟函数被禁止就不能执行了 关中断修改数据结构 关软中断执行并开中断执行软中断函数每一次在执行点上最多执行一次每一类的软中断函数 如果在开中断的时候被中断挂上去的函数 可以且最多可以执行一次最后如果还有挂起的软中断没有执行 就唤醒ksoftirq CPUn内核线程 4 3软中断内核线程 每个cpu都有一个自己的ksoftirq CPUn内核线程 这里 n为CPU的逻辑号 每个ksoftirqd CPUn内核线程都运行ksoftirqd 函数 ksoftirqd task cpu current for if softirq pending cpu schedule set current state TASK RUNNING while softirq pending cpu do softirq if current need resched schedule set current state TASK INTERRUPTIBLE 4 3软中断内核线程 续 软中断内核线程的必要性软中断函数可以自己重新激活自己 如网络软中断和tasklest软中断都可以如此 网卡上高流量可能激活大量软中断没有软中断内核线程 有两种极端的处理方法忽略do softirq运行时新出现的软中断 就是在该函数开始执行时 确定哪些软中断是挂起的 然后一次执行完 但是之后就不再重新检查新的软中断 而是等到下次时钟中断后执行在do softirq中不断检查软中断并执行 这样虽然满足大流量的软中断的执行 但是会使得用户进程长期得不到响应引入ksoftirqd可以在上述两种情况中作一个妥协和折衷 5可延迟函数 tasklet 小任务 简述Tasklet是I O驱动程序中实现可延迟函数的首选方法 Tasklet建立在两个叫做HI SOFTIRQ和TASKLET SOFTIRQ的软中断之上 实际上是一种软中断的应用 这两隔软中断没有太大差别 只是先执行前者后执行后者几个tasklet可以与同一个软中断相关联 即同一个软中断可以串行执行好多的tasklet 5 1tasklet的数据结构 tasklet vec和tasklet hi vec二者分别对应两种软中断所执行的tasklet的数据结构 实际上二者都是一个指针数组 有NR CPUS个元素 每个元素是tasklet head的指针 tasklet head含有指向tasklet struct类型数据结构的指针 晕了 structtasklet struct structtasklet struct next unsignedlongstate TASKLET STATE SKEEDorTASKLET STATE RUN atomic tcount void func unsignedlong unsignedlongdata 5 2tasklet调用步骤和原理 先分配一个新的tasklet struct数据结构 并由tasklet init初始化它Tasklet disable nosync或者tasklet disable函数可以选择性地禁止tasklet可以用tasklet shedule或tasklet hi schedule来调度staticinlinevoidtasklet schedule structtasklet struct t if test and set bit TASKLET STATE SCHED 5 2tasklet调用步骤和原理 void tasklet schedule structtasklet struct t intcpu smp processor id unsignedlongflags local irq save flags t next tasklet vec cpu list tasklet vec cpu list t cpu raise softirq cpu TASKLET SOFTIRQ local irq restore flags 5 2tasklet调用步骤和原理 分配一个新的tasklet struct数据结构 调用tasklet init初始化它调用tasklet disable nosync或tasklet disable来选择性地禁止tasklet调用tasklet schedule或tasklet hi shedule来激活函数在do softirq函数中由tasklet action和tasklet hi action执行具体的tasklet任务staticinlinevoidtasklet schedule structtasklet struct t if test and set bit TASKLET STATE SCHED 5 2tasklet调用步骤和原理 void tasklet schedule structtasklet struct t intcpu smp processor id unsignedlongflags local irq save flags t next tasklet vec cpu list tasklet vec cpu list t cpu raise softirq cpu TASKLET SOFTIRQ local irq restore flags 5 2tasklet调用步骤和原理 inlinevoidcpu raise softirq unsignedintcpu unsignedintnr cpu raise softirq cpu nr Ifwe reinaninterruptorbh we redone thisalsocatchesbh disabledcode Wewill actuallyrunthesoftirqoncewereturnfrom theirqorbh Otherwisewewakeupksoftirqdtomakesurewe schedulethesoftirqsoon if local irq count cpu local bh count cpu wakeup softirqd cpu define cpu raise softirq cpu nr do softirq pending cpu 1UL nr while 0 5 2tasklet调用步骤和原理 staticvoidtasklet action structsoftirq action a intcpu smp processor id structtasklet struct list local irq disable list tasklet vec cpu list tasklet vec cpu list NULL local irq enable while list structtasklet struct t list list list next if tasklet trylock t if atomic read t count 5 2tasklet调用步骤和原理 if test and clear bit TASKLET STATE SCHED 注意 除非tasklet函数重新激活自己 否则 tasklet每次激活至多触发tasklet函数的一次执行 6延时执行 下半部 buttomhalf 下半部分本质上是一个不能与其他下半部分并发执行的高优先级的tasklet 即使它是一个不同的类型 并且在另一个CPU上 global bh lock自旋锁用来确保至多有一个下半部在运行下半部在2 4以前的内核中常用 但是在2 4后 由于其并发效率不高 逐渐为tasklet取代 而为了兼容以前的驱动程序 下半部在2 4继续使用 并在底部使用tasklet来实现 6 1下半部的数据结构 staticvoid bh base 32 void structtasklet structbh task vec 32 在bh base当中大多数是一些与硬件相关的处理 但是其中TIME BH CONSOLE BH TQUEUE BH SERIAL BH IMMEDIATE BH等等有广泛用途 6 1下半部的数据结构 6 2下半部的运行 初始化在bh init里面进行voidinit bh intnr void routine void bh base nr routine mb 删除在remove bh里面进行voidremove bh intnr tasklet kill bh task vec nr bh base nr NULL 6 2下半部的运行 激活在mark bh里面进行staticinlinevoidmark bh intnr tasklet hi schedule bh task vec nr 所有的初始化在softirq init里面进行void initsoftirq init inti for i 0 i 32 i tasklet init bh task vec i bh action i open softirq TASKLET SOFTIRQ tasklet action NULL open softirq HI SOFTIRQ tasklet hi action NULL 6 2下半部的运行 运行下半部通过bh action来执行 它是所有下半部共同的tasklet函数 它使用下半部的标号作为参数 执行如下步骤 获取执行tasklet的CPU逻辑号检查是否已经获取全局的自旋锁 如果有别的CPU在执行这个下半部那就返回 保证全局串行执行获取到全局自旋锁看是否处于中断环境中 且全局中断是否被激活 如果二者之中至少有一个成立 说明不是下半部运行的时机 不可以执行 归还全局自旋锁如果可以执行下半部则立即执行处理函数归还全局自旋锁 6 2下半部的运行 staticvoidbh action unsignedlongnr intcpu smp processor id if spin trylock 6 3扩充下半部份 任务队列 引入可延迟函数的目的是允许一些与中断处理相关的有限个函数以推迟方式执行 这种方式可以从以下两个方面得到延伸允许一个普通的内核函数 而不仅仅是服务于中断的一个函数 能以下半部的身份执行允许几个内核函数 而不是单独的一个函数 能与一个下半部份相关联这种方式可以使用任务队列 taskarray 来表示和运行 6 3 1任务队列数据结构 tq struct结构体structtq struct structlist headlist linkedlistofactivebh s unsignedlongsync mustbeinitializedtozero void routine void functiontocall void data argumenttofunction 其中sync成员用来防止多个taskqueue活动 6 3 2任务队列的运行 DECLARE TASK QUEUE用来分配一个新的任务队列queue task把一个函数插入到任务队列中staticinlineintqueue task structtq struct bh pointer task queue bh list intret 0 if test and set bit 0 run task queue来执行给定的任务队列中所有的函数 6 3 2任务队列的运行 s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论