找回密码
 注册
关于网站域名变更的通知
查看: 374|回复: 1
打印 上一主题 下一主题

研究 linux 内核 - 软中断

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-13 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
研究 linux 内核 - 软中断% U/ y# `& p) K" B

2 J. B6 p- _& g9 h, [- v

; K9 q; K7 Z) t7 W5 L$ _. p' Y" g* ?9 L

6 O' z- F6 M9 }1,说在前面
0 N" r' S6 Q3 j$ o3 q' {0 k' F8 ^0 {$ E% H: c
& C6 z3 Q7 e  ?9 \% C8 a
1》此“软中断”非彼“软中断”,这里说的不是针对硬件中断的那个,而是中断处理流程的下半部分机制之一。) g# G' s$ [: I, w4 w! `( [; S
2》2.6内核有三种下半部机制:软中断,tasklet,work queue。
8 A& w  w  E6 ?3》老的内核使用的BH,task queue,现在都已经不用了。
8 h. B9 P3 Y$ N6 _8 u. Y0 j1 I4》tasklet 需要软中断的帮助。
7 o  [9 n& E# |5》软中断不能抢占其它软中断,但是不同CPU上的可以同时执行。
3 l0 j  n' }# l. G8 U6》软中断只能被中断抢占。8 L. F) B0 M$ p9 e- M) f, ~
7》要用软中断,需要在内核编译前做一些事情,不能完全动态创建。, [0 l, t+ K3 M

( W( U' l* @- v' V& g

, M1 @4 j3 f9 p8 c. G5 ~; S# n2,软中断工作原理和过程
4 _" W' J9 ]+ g1 `( ?) Q. p7 K
6 n/ b# T2 u( @8 i7 m/ C! z

' f6 g- h3 x6 w1 L, G7 q# w5 d1》内核里有一个32个成员的数组。
/ R2 s  q( s; P& B+ b) i7 r数组成员包含软中断处理函数指针,和处理函数的参数。在/kernel/softirq.c里面。
3 l7 M. g& C! h* b( `, |6 G! t7 w+ i/ t0 a# a- ?5 L, c

) T5 E. ~5 O* astatic struct softirq_action softirq_vec[32] _xx__xx。% L* I, x2 P" M8 z8 v) f
3 q' r' P0 t* z* a% }

3 B+ E0 ~9 R, T6 G) S, f; S(我们公司有套加密系统,从source insight里面不能直接copy,必须手输,所以就把后面的变量名称省掉了,见谅。),这个数组的成员定义在interrupt.h里面:0 Y% K: I5 Z, R5 M' E. B& j5 x! ~

5 V) r% C' j0 R" J! ]* Q$ r5 x

' y: `0 o! X* c( ]; _struct softirq_action
, {4 G8 ?5 l4 D( C5 E( T' Q3 ^4 M8 v{
% E! J- F2 _! F0 N: C2 avoid (*action)(struct softirq_action*);2 ^* Q; K8 k0 O8 |) m1 t! G
void *data;- |* Z5 V1 e0 S5 T  Q, U
}, o4 C4 W* p6 z6 @

0 f1 C" `; D" A+ R5 w/ C  s% L
" ]% K, J0 i0 F6 r. Z& c+ Z* t% r. n
9 Q8 g% r$ ~3 W8 h% a! q9 n

4 v6 K5 C# [$ L: t) a' l2》内核里面有个内核线程(叫:ksoftirqd)。0 A4 I- z8 \9 Q% S6 Q
7 B) F/ v' x- [$ x# E5 D" F0 y

1 v" P( D1 z0 }3 _: Z* O1 }$ F( e
, {$ U* Y! J7 U+ V1 ?' D/ K
/ f. L1 C7 f1 O- y

5 `# I& b4 l" `4 F6 f1 @- g3,软中断工作流程) ^2 b8 }+ Y& h) G
. @# I2 s* B- ^7 n: u
" g0 }9 D6 w# P6 ]' \: w
1》ksoftirqd循环检查32位数组。
) [8 |' `  J6 g; E! f* b# ^2》发现某一位被标记,就执行它对应的软中断处理函数。! ]: N' x( Q% `2 t# z

: y8 G/ I1 ~  k0 C
* j/ Z1 |" U7 Z( c! x" d
4,在驱动中如何使用软中断* x# {) [* ]) e& e4 e: h
# d- w! Y; S% ?2 o* g  X

# ~% _; ]. f  @1》请确认一定要用软中断(或许可以考虑tasklet,呵呵)。
& N9 @# G8 w6 w1 C: C2》在内核编译前,分配索引:
6 c6 J! Y$ x' d  X在linux/interrupt.h里面的232行有个枚举,在里面加入一行(比如叫:RILL_SOFTIRQ)。注意,不能简单的加到最后,要根据你想要的优先级来加。想高点,就加到前面一点,反之,你懂的。
9 a* N" [% p- a( W- G3》编译内核2 b# W$ L$ G3 Z5 X, t7 Z8 I3 h) j
4》在你的驱动里注册软中断处理函数$ ^: I2 L7 v1 |
open_softirq(RILL_SOFTIRQ,rill_softirq_func,NULL);& f: g/ f+ j2 Y/ k% ]' ?$ T! {
5》在你的中断处理程序返回前触发软中断(加标记)# K. v7 q/ t9 B. `9 b, h
raise_softirq(RILL_SOFTIRQ);这个函数会先禁止中断,返回前恢复;
) A/ S# c# y: g  r& P$ a2 _如果你知道中断已经禁止了就用下面这个函数:% t& C; }# U, O, I: f
raise_softirq_irqoff(RILL_SOFTIRQ);
. t4 A& U+ R0 H4 n0 H
- x( j) p( x0 {

0 M8 n: O: T9 `( z) W- b* C( c! Z( S+ i/ F
4 H3 H6 S# Q  A! U

该用户从未签到

2#
发表于 2019-10-13 20:44 | 只看该作者
研究一下,谢谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:37 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表