Linux中断机制.PPT

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux中断机制

Linux中断机制(2)--软中断 梁 冰 北大网络分布式实验室 2004.11.15 1.软中断简介 回忆前面的知识 硬中断最后的处理do_IRQ()函数中,最后的一个处理是什么?do_softirq()! 为什么要软中断? 硬中断中是需要尽快响应和处理的,不能将太多时间放在中断事件的处理上,否则会丢失掉另外的相同类型的中断 一些中断需要处理的工作不是那么急迫 硬件中断打断CPU,软中断打断内核序列 2.软中断分类 Linux2.4.*系列有三种可延迟中断内核函数: 软中断(softirq) 小任务(tasklet) 下半部分(bottom half) 三者之间关系 Tasklet用softirq实现,bottom half用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项有用。 struct softirq_action { void (*action)(struct softirq_action *); void *data; }; 4.1 软中断主要数据结构 Irq_stat 是irq_cpustat_t数组,每一个CPU一个。其实在硬中断处理部分已经使用了其中的许多数据项了。 typedef struct { unsigned int __softirq_pending; unsigned int __local_irq_count; unsigned int __local_bh_count; unsigned int __syscall_count; struct task_struct * __ksoftirqd_task; /* waitqueue is too large */ unsigned int __nmi_count; /* arch dependent */ } ____cacheline_aligned irq_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 软中断的相关调用 关键代码: asmlinkage void do_softirq() { int cpu = smp_processor_id(); __u32 pending; unsigned long flags; __u32 mask;

您可能关注的文档

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档