(オリジナル)第六章割込みと割込み処理関数(Interrupts and Interrupt Handlers)Part 1
一、登録割込み処理関数
割り込みプロセッサはハードウェアを管理するドライバの職責であり、各デバイスにはそれに対応するドライバがあり、割り込み処理関数の登録を駆動する.ドライバは、割り込み処理プログラムを登録し、このプログラムによって処理できる所定の中断線を使用することができる.
1、The first parameter,irq、割り当てられた割り込み番号を指定する.従来のデバイスではSystem TimerなどのIRQは固定されており、以下の表はPC割り込みの典型的な割り当てである.
PC IRQ-Table
0
System Timer
1
Keyboard
2
Switch to IRQ controller 2
3
COM2, COM4
4
COM1, COM3
5
LPT2/free
6
Floppy
7
LPT1, LPT3
8
Real Time Clock
9
Redirected IRQ 2
10
free
11
free
12
PS/2 Mouse
13
Math Co-Processor
14
Primary IDE Controller
15
Secondary IDE Controller
2、The second parameter,handler、当該割り込み処理プログラムにサービスする関数ポインタ
3、The third parameter、irqflags、0または次のbit maskタグのうちの1つ以上 SA_INTERRUPT この割り込み処理関数が高速割り込み処理プログラムであることを示します.歴史上、Linuxは高速と低速の処理プログラムを区別した.今日、両者の唯一の違いは、高速プロセッサが実行時にすべての割り込みを無効にし、他の割り込みによって中断されずに迅速に実行できるようにすることです.スロープロセッサは無効です
デフォルトでは(このタグは使用されません)、現在実行中のプロセッサが存在する中断線を除いて、すべてのプロセッサでマスクで無効になっているすべての割り込みが有効になります.Sans the timer interrupt, most
interrupts do not want to enable this flag. SA_SAMPLE_RANDOM This flag specifies that interrupts generated by this device should contribute to the kernel entropy pool. The kernel entropy pool provides truly random numbers derived from various random events. If this flag is specified, the timing of interrupts from this device are fed to the pool as entropy. Do not set this if your device issues interrupts at a predictable rate (for example, the system timer) or can be influenced by external attackers (for example, a networking
device). On the other hand, most other hardware generates interrupts at nondeterministic times and is, therefore, a good
source of entropy. For more information on the kernel entropy pool, see Appendix B, "Kernel Random Number Generator." SA_SHIRQ このタグは、このブレークラインが複数の割り込みプロセッサによって共有できることを示す.所与の中断線に登録された各処理は、このタグを指定しなければならない.そうでなければ、各ブレークラインには1つのプロセッサしかありません.
4、The fourth parameter、devname、この中断したデバイスに関連付けられたASCII文字記述.この文字名は/proc/irqと/proc/interruptsによって使用され、ユーザーと通信します.
5、The fifth parameter, dev_id、主に共有中断線に使用
戻り値:
正常な戻り値は0です.ゼロ以外の値はエラーを示し、割り込み処理プログラムが登録できなかったことを示す.通常のエラーはEBUSYで、指定された中断線がすでに使用されていることを示します(現在の使用者またはあなたがSA_SHIRQを指定していません).
Note:request_IRq()はsleepする可能性があるため、コンテキストを中断したり、他のコードがブロックできない環境で呼び出すことはできない.sleepが安全でない場合request_を呼び出すIRq()はcommon misktakeです.
二、割込み処理関数の解放
driverをアンインストールする場合は、unregisterがプロセッサを中断し、ミッドレンジを無効にする必要があります.次のメソッド実装を呼び出す
指定された中断線が共有されていない場合、この関数はプロセッサから削除され、中断線が無効になります.中断線が共有されている場合はdev_を通過するid認識されたプロセッサは削除されるが、中断線自体は最後のプロセッサが削除された場合にのみ無効になる.
共有中断線の場合、同じアドレスライン上に存在する複数のプロセッサを区別し、free_を許可する一意のクッキーが必要である.IRq()は、正しい処理プログラムのみを除去する.いずれの場合もdev_idは空ではなく、所望のプロセッサと一致しなければならない.
free_IRq()の呼び出しはプロセスコンテキストで完了する必要がある.
割り込みプロセッサはハードウェアを管理するドライバの職責であり、各デバイスにはそれに対応するドライバがあり、割り込み処理関数の登録を駆動する.ドライバは、割り込み処理プログラムを登録し、このプログラムによって処理できる所定の中断線を使用することができる.
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *,struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id)
1、The first parameter,irq、割り当てられた割り込み番号を指定する.従来のデバイスではSystem TimerなどのIRQは固定されており、以下の表はPC割り込みの典型的な割り当てである.
PC IRQ-Table
0
System Timer
1
Keyboard
2
Switch to IRQ controller 2
3
COM2, COM4
4
COM1, COM3
5
LPT2/free
6
Floppy
7
LPT1, LPT3
8
Real Time Clock
9
Redirected IRQ 2
10
free
11
free
12
PS/2 Mouse
13
Math Co-Processor
14
Primary IDE Controller
15
Secondary IDE Controller
2、The second parameter,handler、当該割り込み処理プログラムにサービスする関数ポインタ
3、The third parameter、irqflags、0または次のbit maskタグのうちの1つ以上
デフォルトでは(このタグは使用されません)、現在実行中のプロセッサが存在する中断線を除いて、すべてのプロセッサでマスクで無効になっているすべての割り込みが有効になります.Sans the timer interrupt, most
interrupts do not want to enable this flag.
device). On the other hand, most other hardware generates interrupts at nondeterministic times and is, therefore, a good
source of entropy. For more information on the kernel entropy pool, see Appendix B, "Kernel Random Number Generator."
4、The fourth parameter、devname、この中断したデバイスに関連付けられたASCII文字記述.この文字名は/proc/irqと/proc/interruptsによって使用され、ユーザーと通信します.
5、The fifth parameter, dev_id、主に共有中断線に使用
戻り値:
正常な戻り値は0です.ゼロ以外の値はエラーを示し、割り込み処理プログラムが登録できなかったことを示す.通常のエラーはEBUSYで、指定された中断線がすでに使用されていることを示します(現在の使用者またはあなたがSA_SHIRQを指定していません).
Note:request_IRq()はsleepする可能性があるため、コンテキストを中断したり、他のコードがブロックできない環境で呼び出すことはできない.sleepが安全でない場合request_を呼び出すIRq()はcommon misktakeです.
二、割込み処理関数の解放
driverをアンインストールする場合は、unregisterがプロセッサを中断し、ミッドレンジを無効にする必要があります.次のメソッド実装を呼び出す
void free_irq(unsigned int irq, void *dev_id)
指定された中断線が共有されていない場合、この関数はプロセッサから削除され、中断線が無効になります.中断線が共有されている場合はdev_を通過するid認識されたプロセッサは削除されるが、中断線自体は最後のプロセッサが削除された場合にのみ無効になる.
共有中断線の場合、同じアドレスライン上に存在する複数のプロセッサを区別し、free_を許可する一意のクッキーが必要である.IRq()は、正しい処理プログラムのみを除去する.いずれの場合もdev_idは空ではなく、所望のプロセッサと一致しなければならない.
free_IRq()の呼び出しはプロセスコンテキストで完了する必要がある.