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

研究 linux 内核 - 软中断

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
研究 linux 内核 - 软中断
3 m/ d4 X6 r; ~/ U3 r, k( r
- Y& l4 f4 m/ ~1 l3 W, G/ ?$ h. T, Y
! {7 i6 n: q" T8 I* G3 J
3 a. A% a5 B! D/ |8 S

- p! S. {6 q% @( B. T: f1,说在前面6 W9 }" ?4 o' I* T5 Y
' i% u9 |! P) {, N4 i0 T

: ^3 t7 I# A0 l7 O2 D) W1》此“软中断”非彼“软中断”,这里说的不是针对硬件中断的那个,而是中断处理流程的下半部分机制之一。, X2 f3 q# u2 v& \/ `) M
2》2.6内核有三种下半部机制:软中断,tasklet,work queue。3 v0 U& q/ R1 ~  h
3》老的内核使用的BH,task queue,现在都已经不用了。
% f4 z" W! c$ \. Q4》tasklet 需要软中断的帮助。
3 h5 X% L: r5 u. l5》软中断不能抢占其它软中断,但是不同CPU上的可以同时执行。) Y( C9 f% u% b* b! {5 ~0 W
6》软中断只能被中断抢占。7 y/ R- C- B# H6 q
7》要用软中断,需要在内核编译前做一些事情,不能完全动态创建。
' |' g1 }7 R/ _) Y) N% [1 e& A4 Y2 \' C7 D* }
# c* G6 @8 L$ x# ~4 Y
2,软中断工作原理和过程7 U" j/ o3 e. ^& {: p! n7 ^
3 M7 ?6 P% U5 U2 a+ L
: s3 [! p# x4 ?
1》内核里有一个32个成员的数组。
' x2 K6 n4 F& T9 e  z数组成员包含软中断处理函数指针,和处理函数的参数。在/kernel/softirq.c里面。
1 ^7 `8 s& o. ?' ~% C- C! n
( i# |# m4 b( H, q) ?/ ]- {
% \8 H2 p5 r$ X/ g
static struct softirq_action softirq_vec[32] _xx__xx。; o; j* t" X* R

' ~9 F" [/ E- h6 \/ L. P
0 t& E& ?( r" [1 C0 H
(我们公司有套加密系统,从source insight里面不能直接copy,必须手输,所以就把后面的变量名称省掉了,见谅。),这个数组的成员定义在interrupt.h里面:
/ \" U0 Z8 i& A# i  }) h  h9 z  `. o$ d! ^

) @4 O. i8 m8 V. I% m( Nstruct softirq_action
/ s. {' s) R7 u0 ^: {{4 s1 Z2 n. |; K0 W, N
void (*action)(struct softirq_action*);. ~: M: F( U& w4 E/ r# d: _
void *data;
* Y& Y, w! h5 q# z, J# \}' ~, P& S& ?0 C+ M+ T! t- {' C

- K. b0 y3 A6 B' A
9 y1 u, M1 I* V: h  _, \, W

  r; J1 `$ O" U4 m1 U; a. S
3 n8 a4 B8 N6 X( ~2 z$ ]; U, h" D3 w
2》内核里面有个内核线程(叫:ksoftirqd)。
& S0 B4 f9 q* A! m1 w7 z+ x; g( ^
) t& D. V0 {) v2 Q7 r- W5 n

9 l; ], I; E# ~2 x' Q/ m
& L, N( d- d4 E0 ~1 D0 Q
6 P2 Q, H4 e$ p4 v8 Z; }

, Q8 q  U+ G/ k! B3,软中断工作流程
5 F) O4 F0 W- D/ n( P8 D; @8 S8 \& j+ z' ?& _  P, K% p+ n
- `( Q* H7 V* U. q5 Y
1》ksoftirqd循环检查32位数组。
7 q: a- ^& }6 H& o0 k0 b2》发现某一位被标记,就执行它对应的软中断处理函数。4 H0 u: o' J$ }) b; {0 U

. A& O5 q, g  d; {: i& b
  M$ {+ m7 s/ f6 t
4,在驱动中如何使用软中断4 a: B2 X" s/ ]& B4 P
" E; P! o' C8 Z4 t
& [' e$ h0 V; l' f3 \( J
1》请确认一定要用软中断(或许可以考虑tasklet,呵呵)。
4 b8 x7 J8 d9 J# H: M$ D9 ~% \" o2》在内核编译前,分配索引:4 P8 G: m6 |$ w* B
在linux/interrupt.h里面的232行有个枚举,在里面加入一行(比如叫:RILL_SOFTIRQ)。注意,不能简单的加到最后,要根据你想要的优先级来加。想高点,就加到前面一点,反之,你懂的。
" F) C- f- W7 j, }6 h* v3》编译内核* l+ B' ~+ Z9 G. r2 A
4》在你的驱动里注册软中断处理函数
9 h0 ~( C/ l9 b+ s) C$ F, jopen_softirq(RILL_SOFTIRQ,rill_softirq_func,NULL);
  b/ s7 j% i7 Y" J5》在你的中断处理程序返回前触发软中断(加标记)$ j: y' S' _7 U. T
raise_softirq(RILL_SOFTIRQ);这个函数会先禁止中断,返回前恢复;
3 ?% n  M8 X+ |! r5 i如果你知道中断已经禁止了就用下面这个函数:; N/ e& n9 {% O# _, ?2 @7 r4 c
raise_softirq_irqoff(RILL_SOFTIRQ);" m4 _9 A/ B7 q
( `# |8 Q& g' ~( A' ~" M
7 y+ W' f, _, Z% r3 f
/ c4 W0 b% L$ d1 |1 @9 Y
" R! g. N8 o/ H: Q! L  T' I

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 08:35 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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