Linux Kernel(2.6)の実装に関するメモ書き

ソフト割り込み


Rev.5を表示中。最新版はこちら

1.割り込みの種類

Linuxではソフトウェアで行う割り込み処理に様々な種類がある。Kernel2.6ではソフト割り込みとタスクレットのみとなっている。すでに無くなっているものも含めて以下に示す。

1.1 BH (Bottom Half)

Linux初期の頃からある割り込み処理形式。
登録数は32まで。

マルチプロセッサのシステムでも複数実行は不可(常に1つしか実行されない)。

Kernel 2.4の実装としては高優先度タスクレットとして登録され実行されている。
Kernel 2.6では削除された。

1.2 タスクキュー

BHの拡張。
一つのBHに複数のハンドラを登録できるようにして、BHの数の制限を回避している。
タスクキューはBHの中で処理される。

Kernel 2.6では削除された。

タスクキューの例:
tq_immediate 即実行用タスクキュー
tq_timer     タイマ用タスクキュー

1.3 ソフト割り込み

現在使用されている割り込み処理。
マルチプロセッサの場合、各プロセッサで同じ割り込みが動作可能。

1.4 タスクレット

        ソフト割り込みの一つ。

        複数のハンドラを登録できる。
        複数のCPUで同時実行できるが同じタスクレットは同時実行できない。


2.実装関連

2.1 ソフトウェア割り込み

softirq_vec[]がソフトウェア割り込みのベクタテーブルで、ここにソフト割り込みのハンドラが登録される。

また、新規の割り込みはタスクレットとして実装するようにlinux/interrupt.hに記されている。



ソフトウェア割り込みのベクタテーブル
softirq_vec[]
+--------------+
| | HI_SOFTIRQ:tasklet_hi_action()
+--------------+
| | TIMER_SOFTIRQ
+--------------+
| | NET_TX_SOFTIRQ
+--------------+
| | NET_RX_SOFTIRQ
+--------------+
| | BLOCK_SOFTIRQ
+--------------+
| | TASKLET_SOFTIRQ:tasklet_action()
+--------------+
:
+--------------+
| |
+--------------+
32エントリ
[関連ルーチン]
open_softirq()
ソフト割り込みを登録する。
(softirq_vec[]にハンドラを登録)

raise_softirq()
ソフトウェア割り込みをスケジュールする
(pendingフラグを立ててksoftirqd()をWakeupする)

2.2 タスクレット


tasklet_vec[] (HI_SOFTIRQ用にtasklet_hi_vec[]もある)
+--------------+
| CPU#0 | --> tasklet_struct -> tasklet_struct ->
+--------------+
| CPU#1 |
+--------------+
:

タスクレットのハンドラを登録する。
tasklet_init()でtasklet_structを初期化して、
tasklet_schedule()によってtasklet_structをチェーンして、
TASKLET_SOFTIRQをスケジュールする



最終更新 2006/06/23 20:56:53 - kztomita
(2006/03/27 12:55:18 作成)


リンク
最近更新したページ
検索