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

Linux内核设计与实现之中断处理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-12 15:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
本帖最后由 pulbieup 于 2020-11-12 15:45 编辑 / L. a; T$ f0 y/ _
: K  s9 K' {3 J9 R; r
中断处理一般不是纯软件来实现的,需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理,特别是驱动程序的开发。) w2 z5 H7 }/ w2 y

, r+ i& V4 w  g主要内容:2 i0 X7 E( B- u+ \3 i: o
& e' T- a' E' s# `  a+ S
什么是中断  m, \  t8 Q/ ~0 W# l6 q1 }
中断类型" B$ E# W* T; K  J5 }
中断相关函数
5 V: J; l. x! d中断处理机制% d. K& q* V7 d. b% @
中断控制方法
  @; _/ L# s( X3 s* O总结
( e% y) D& N4 ^2 k ! L% `& i2 j7 I! |% t$ m
! O# q6 |( Q3 J: F
1. 什么是中断
. i1 `; d- @' j8 \# p为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。" Y" A7 i* P" j; j$ V
# O" G; Y! F8 d( ~7 H
没有中断的话,CPU和外围设备之间协同工作可能只有轮询这个方法:CPU定期检查硬件状态,需要处理时就处理,否则就跳过。" b7 I5 g* u4 b: S7 P
/ r. s& o0 [3 C7 M  _
当硬件忙碌的时候,CPU很可能会做许多无用功(每次轮询都是跳过不处理)。
: T+ z; [& g$ D$ v; [
! y4 _# g2 f2 |# g' ~ 9 l+ }/ ^* [% n! H$ e* o( x

" k) Y9 A# t; y( U5 ]& J中断机制是硬件在需要的时候向CPU发出信号,CPU暂时停止正在进行的工作,来处理硬件请求的一种机制。# k5 Z" P" j$ _4 z- V

7 I0 b5 c5 V0 G& H # [. }' k8 v' f
( p/ z7 p8 s1 q- ~5 I2 S) ]
2. 中断类型$ X' Z& h+ _2 _  G  e- g
中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。# [, r* I( Z! e, n2 a
# N* U& w+ \- p% q
异步中断:CPU处理中断的时间过长,所以先将硬件复位,使硬件可以继续自己的工作,然后在适当时候处理中断请求中耗时的部分。: K& w; S9 d8 d7 h: F% F2 T7 c) W
2 b3 Y* b: J. n; \# V8 M* W
举个例子:网卡的工作原理5 v! p6 `2 H, K3 ?8 h3 p

* c: V7 k' ]4 r" z2 o+ V: K9 R( M    网卡收到数据包后,向CPU发出中断信号,请求处理接收到的数据包
+ E+ P, J$ o1 Q7 ~! v$ z; f. _    CPU将收到的数据包拷贝到内存后,即通知网卡继续工作, }' N4 K$ S, _5 D! l4 B5 b! \1 x
    至于数据包拷贝至内存后的处理会在适当的时候进行
) |( u' b, P6 L- `8 K . {# V+ S9 W$ \
8 L" G( D2 i0 V. L) v
这样做避免了处理数据包时间过长导致网卡接收数据包速度变慢。
/ D) f& M" ]- ^( a* D$ u. S  E, {4 t6 Q3 D4 C% Z/ C7 i

' q) Y( w1 e; z; i! o# P! Z, T- y, l
同步中断:CPU处理完中断请求的所有工作后才反馈硬件
$ t$ v# M8 d3 b) j: ?5 e9 Z6 O6 \# S2 f! q  R
举个例子:系统异常处理(比如运算中的除0操作)
9 s0 z/ k0 G6 ?+ w) R. ]" a0 ^5 o' F9 w
    应用程序出现异常后,需要内核来处理
9 i" Y0 N$ d8 j9 Y5 r+ l    内核调用相应的异常处理函数来处理异常5 U! \( N' ]3 C( ^0 H; H
    处理完后终了应用程序或者给出message
! }( U) K5 {3 N! F+ O   L9 }3 ]# ^: h7 a6 H$ g( a

6 a# }' r: g0 C7 p) K: H' O同步中断应该处理能很快完成的一种中断。8 Y; @  S, X: `% s
& p/ p& `! x/ ^8 v4 d

  j$ C8 A) @% K  H: z" N7 S
- C! m  ^$ b. p) L- ?2 w5 z3. 中断相关函数' M( ~% }; w! |0 k
实现一个中断,主要需要知道3个函数:
2 K; q# B/ H! f6 v' i1 H
( K% X: b: n& i8 I注册中断的函数, w2 n( b+ o* i" E
释放中断的函数; G" J+ [; H4 k3 h3 \; |3 m
中断处理程序的声明
& \, V* x; p1 p& u 5 d- [7 ^* Q, L

4 f/ s) ~5 m. h& k0 {. i' b8 X3.1 注册中断的函数
! b. q  _, q; C/ e& T- G& {2 J# }    位置:<linux/interrupt.h>  include/linux/interrupt.h
% _5 W( P# c; j" x. z, u
: `  v6 q7 k% S: `
! n0 j7 U5 z0 T% T) v. c. ]5 H
# {8 h5 @& c" v* I# i2 R  ?定义如下:
' Q1 j9 ?# i; \3 Q" v+ G, _1 \# g" f2 P: a: v! s' u- L1 P
复制代码+ D8 ]/ N1 E6 _4 H6 U7 ~3 u
/*
) j! G  v! j% d% W5 x- x * irg     - 表示要分配的中断号" o& T# d0 s" F8 O3 [. j
* handler - 实际的中断处理程序
: J( Q3 E/ M. _& R5 N0 o" n$ J$ \8 w * flags   - 标志位,表示此中断的具有特性
' v; _! S6 l1 L4 _# w4 d * name    - 中断设备名称的ASCII 表示,这些会被/proc/irq和/proc/interrupts文件使用
6 i; _5 A$ P% X, r * dev     - 用于共享中断线,多个中断程序共享一个中断线时(共用一个中断号),依靠dev来区别各个中断程序
$ G' y9 J# o% L$ _) |: _1 m8 @6 h  w * 返回值:
% u( R- b2 h, J+ t6 H  i. I * 执行成功:0
) @6 a" w! i+ f* c * 执行失败:非0
8 G  Z( Y6 v# o% f# U. K! j* e. s8 X; P */- E2 ~, x& B4 S! X
int request_irq(unsigned int irq,8 S7 [4 G/ Z8 Z" t
                irq_handler_t handler,0 g) K( w. |3 ?% C
                unsigned long flags,* d: Q% t- L/ y. |/ O
                const char* name,4 u: T. q: |# s4 S
                void *dev)2 B' }2 M7 n. {$ h5 R  b; I
复制代码9 s& s, y; A2 `4 }

3 {! J/ y" w1 o; p0 Z' Q: k7 `% n3 z; F* |
3.2 释放中断的函数
, W- P6 k5 v  ~" E8 t3 n' S定义比较简单:- f+ O, H2 e* Z1 M  m) y' X1 v+ u

* ~: J; |- E9 ]4 ?void free_irq(unsigned int irq, void *dev)+ _9 H) Z' A: b3 \
如果不是共享中断线,则直接删除irq对应的中断线。
* r) c2 x* ?1 v8 q
1 S! S3 U2 O, x& c5 C如果是共享中断线,则判断此中断处理程序是否中断线上的最后一个中断处理程序,
( f2 f- r7 d6 H8 M
1 L. E) q) i1 {    是最后一个中断处理程序 -> 删除中断线和中断处理程序. w) L& h3 d3 W) n1 k- C

0 V* @- F: _! Z; _    不是最后一个中断处理程序 -> 删除中断处理程序! Z  G! l* T3 K) k, M% S$ g- T; W
2 ~+ J* ^2 h7 o. c8 i* B

* R. M. H. o2 X6 N
' V, G$ C& [, o' Z# a7 P3.3 中断处理程序的声明$ v' Z* |( I6 o3 O3 w( Y6 j6 j
声明格式如下:9 N) \0 T+ ?' j1 ^) w% R  n& H

( l$ b+ n5 }) F8 O/ c( |复制代码
7 p! t+ {8 u# b( @6 D6 F; p3 W/* # |5 y0 U( N5 |+ D0 ]* ]) v2 E
* 中断处理程序的声明2 e$ T! i& ]2 A
* @irp  - 中断处理程序(即request_irq()中handler)关联的中断号+ i+ @- P( S3 `3 `
* @dev  - 与 request_irq()中的dev一样,表示一个设备的结构体4 ^) f& t  \$ d# y
* 返回值:) Z; G" o& B( J$ S
* irqreturn_t -  执行成功:IRQ_HANDLED  执行失败:IRQ_NONE1 Z% y+ Q" }+ D" b6 F6 |
*/
% `: [2 J3 y( D: k  ^' }5 bstatic irqreturn_t intr_handler(int, irq, void *dev)
2 K7 A- S% u# \7 C& z  S$ |复制代码& r$ S) R2 r+ e
/ V/ V! l/ O/ D( H0 h' y; Y

/ _6 i/ T9 c/ f! l5 M- l4. 中断处理机制3 b, L" k& z9 P; A: o$ P) D7 Z$ F1 t
中断处理的过程主要涉及3函数:: E- i" j2 {0 _
1 p: A, N+ A: R  S" Y* i. |
do_IRQ 与体系结构有关,对所接收的中断进行应答
( F2 b9 y7 a& q- M( }handle_IRQ_event 调用中断线上所有中断处理
; H/ @8 Q4 o; P$ Bret_from_intr 恢复寄存器,将内核恢复到中断前的状态
* _9 R) L) [  z7 U % r3 x, [% @1 T+ t' V

; Z3 P) W  P* }5 f4 q! g. Q处理流程可以参见书中的图,如下:
3 G4 z* g. t& z6 ~7 n0 l4 ]/ C# m. H- c; K5 b9 P1 w, i( y

5 B1 `1 Y' r" Q0 \8 U  C* O$ |
. _2 ~4 J. M, f3 W* J& m3 O
" x( N( h4 _" ~! h$ {$ x- z8 \+ H' t% @; W+ `% ]/ r! |7 s
5. 中断控制方法
/ e/ @8 ^$ F3 i  s' k4 I' C7 b! H常用的中断控制方法见下表:. L' J  i5 y( T1 u1 S, V) v/ w
函数
说明
local_irq_disable()禁止本地中断传递
local_irq_enable()激活本地中断传递
local_irq_save()保存本地中断传递的当前状态,然后禁止本地中断传递
local_irq_restore()恢复本地中断传递到给定的状态
disable_irq()禁止给定中断线,并确保该函数返回之前在该中断线上没有处理程序在运行
disable_irq_nosync()禁止给定中断线
enable_irq()激活给定中断线
irqs_disabled()如果本地中断传递被禁止,则返回非0;否则返回0
in_interrupt()如果在中断上下文中,则返回非0;如果在进程上下文中,则返回0
in_irq()如果当前正在执行中断处理程序,则返回非0;否则返回0

( H2 \  b2 Z/ y' h总结3 e0 c# E, D8 h' N3 I9 y8 E
0 P* {. }2 Z. T5 ?
) _& X* N# {- r1 i4 ^0 M; m$ M" M
中断处理对处理时间的要求很高,如果一个中断要花费较长时间,那么中断处理一般分为2部分。
' J6 l5 D6 C6 _$ L1 x. C# Z
$ z+ l1 I0 \8 ]( R0 u上半部只做一些必要的工作后,立即通知硬件继续自己的工作。$ ^$ y: k1 U. }" ~3 b
- n+ g6 P8 G0 }2 t
中断处理中耗时的部分,也就是下半部的工作,CPU会在适当的时候去完成。8 D" U7 B, j. v8 M5 @: E

该用户从未签到

2#
发表于 2020-11-12 15:58 | 只看该作者
Linux内核设计与实现之中断处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 20:30 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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