Mona のドライバモデルをきちんと決めるべく既存の OS のドライバモデルを調べていこう。
- キャラクタデバイス
- cdevsw 構造体
- open/close/read/write/ioctl/pool/map
- システム起動時、デバイス構成時などに生成
- デバイス番号
- /dev/ に cdevsw の各要素がマッピングされる
- 自動コンフィギュレーションおよび初期化のための関数
- ハードウェアの存在を検出(probe)
- 初期化時に1度呼ばれる
- 入出力要求を処理するための関数(カーネル上部)
- 割り込みを処理するための関数(カーネル上部)
- デバイスドライバ下部
- 自身のスレッドコンテキストを持たない
- ブロックする事も可能(5.2以降)
- クラッシュダンプ関数
動き方
典型的な入出力デバイスの場合
- 入出力要求をデバイス単位の処理キューに置く
- 割り込み時にキューから取りだし処理をして通知
デバイスドライバ上部と下部がキューを介して通信。
割り込み
割り込み処理では、グルー関数が割り込みベクタテーブルに登録される。
グルー関数は統計情報更新したあとに、ドライバの割り込み処理スレッドをスケジュールして戻る。
所感
ドライバ割り込み処理が即座に実行されなければいけないケースはないのかなあ。>グルー関数。
これでハードウェア応答要求に間に合うのだろうか。もしそうならば、現状の Mona のスタイルでも良いかもしれない。