注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

linux软件中断——框架搭建  

2012-10-02 09:36:06|  分类: linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
软件中断实际上是仿硬件中断来实现的,下面我们来看一看它的框架
1、注册
void open_softirq(int nr, void (*action)(struct softirq_action *))
{
softirq_vec[nr].action = action;
}

softirq_vec是软中断向量表,成员action为中断处理函数!定义如下:
static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
struct softirq_action
{
void (*action)(struct softirq_action *);
};

2、开中断
内核使用一个名为__softirq_pending的位图来描述软中断,每一个位对应一个软中断。开关中断使用下面的函数:
or_softirq_pending();
#define or_softirq_pending(x)  (local_softirq_pending() |= (x))
#define local_softirq_pending()     _IRQ_STAT(smp_processor_id(), __softirq_pending)
#define __IRQ_STAT(cpu, member) (irq_stat[cpu].member)
如果要开中断的话,就将nr对应的置为1!我们还可以看看irq_stat的定义:
extern irq_cpustat_t irq_stat[];
typedef struct {
unsigned int __softirq_pending;
} ____cacheline_aligned irq_cpustat_t;
果然发现了软中断的位图!

3、激活
do_softirq();
我们来分析一下:
asmlinkage void do_softirq(void)
{
__u32 pending;
unsigned long flags;

if (in_interrupt())  //不能在中断上下文处理软中断
return;

local_irq_save(flags);

pending = local_softirq_pending(); //用来获取整个位图

if (pending)             //如果pending不为0,也就是有软中断被开启,就执行__do_softirq
__do_softirq();

local_irq_restore(flags);
}

__do_softirq
      h = softirq_vec;
      h->action(h);//执行软中断服务程序

我们看到软中的框架是很简单的,写一个软中断函数的话,只需要
1、注册
2、开中断
3、在适当的实际来激活

linux内核本身实现的软中断有下面几个:
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ,      /* Preferable RCU should always be the last softirq */

NR_SOFTIRQS
};
 
内核的开发者并不建议我们注册自己的软中断,如果我们要使用软中断的话,可以使用基于软中断的tasklet机制!我们留在下一节来说!
  评论这张
 
阅读(651)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017