|
|
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
|
|