博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【linux kernel】 softirq 软中断讨论
阅读量:6599 次
发布时间:2019-06-24

本文共 1840 字,大约阅读时间需要 6 分钟。

欢迎转载,转载时需保留作者信息,谢谢。

邮箱:tangzhongp@163.com

博客园地址:http://www.cnblogs.com/embedded-tzp

Csdn博客地址:http://blog.csdn.net/xiayulewa

早看到这篇文章,就不写了,懒:

 :

1.1.  数据结构

struct softirq_action

{

    void    (*action)(struct softirq_action *);

};

 

²  static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;

 

softirq_vec是一个struct softirq_action数组,使用open_softirq注册

 

Softirq.c (src\kernel):52 中:

²  irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;

其操作:raise_softirq_irqoff→or_softirq_pending置位bitmapirq_stat[cpu].__softirq_pending

 

1.2.  软中断注册

 

void open_softirq(int nr, void (*action)(struct softirq_action *))

{

    softirq_vec[nr].action = action;

}

不是链表结构。

 

可被注册的有

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

};

 

如在softirq_init中有open_softirq(TASKLET_SOFTIRQ, tasklet_action);

这说明 tasklet是被放入软中断中执行的。

1.3.  软中断执行流程

1.3.1.   路径1

open_softirq注册→raise_softirq→raise_softirq_irqoff→raise_softirq_irqoff→wakeup_softirqd

wakeup_softirqd中唤醒ksoftirqd进程,

 

static struct smp_hotplug_thread softirq_threads = {

    .store          = &ksoftirqd,

    .thread_should_run  = ksoftirqd_should_run,

    .thread_fn      = run_ksoftirqd,

    .thread_comm        = "ksoftirqd/%u",

};

 

执行.thread_fn = run_ksoftirqd  →__do_softirq

_do_softirq中有

h = softirq_vec;

……………………………

h->action(h); 即为具体注册函数

……………………………

 

Ksoftirqd:是个线程, 其流程为

start_kernelrest_initkernel_initkernel_init_freeable

do_basic_setup→do_initcalls→spawn_ksoftirqd

→smpboot_register_percpu_thread(&softirq_threads)

 

 

1.3.2.   路径2

open_softirq注册→raise_softirq→raise_softirq_irqoff→raise_softirq_irqoff→irq_exit(在中断退出时执行)→invoke_softirq→do_softirq(wakeup_softirqd) →__do_softirq→ h->action(h); 即为具体注册函数

 

 

转载于:https://www.cnblogs.com/embedded-tzp/p/4452041.html

你可能感兴趣的文章
Ubuntu 操作系统操作
查看>>
iis的gzip功能
查看>>
关于javascript的回调函数与异步函数的关系理解
查看>>
使用Typescript开发node.js项目
查看>>
其他服务器 之 摄像头(WebCam)在Linux中采用Spcaserv 架设网络视频监控服务器 (v0.1b)...
查看>>
什么是validationQuery?
查看>>
【C++探索之旅】第一部分第九课:数组威武,动静合一
查看>>
BGP笔记4
查看>>
vue学习:10、第一个项目,实践中遇到的问题
查看>>
在网商大会上马云的讲话
查看>>
Linux下修改Mysql的用户(root)的密码
查看>>
shell脚本练习
查看>>
通过Linux理解操作系统(三):进程管理(下)
查看>>
AFNetworking3.0的使用(内附网络状态监测功能的使用)
查看>>
sed的基本用法
查看>>
我的友情链接
查看>>
【BZOJ [1878】[SDOI2009]HH的项链
查看>>
读【选修计算机专业的伤与痛】
查看>>
GNU开发工具——CMake模块
查看>>
JPA常用注解
查看>>