BeOS - 既存のドライバモデルを調べよう

Mona のドライバモデルをきちんと決めるべく既存の OS のドライバモデルを調べていこう。
前回までのあらすじはこちら。(Windows - 既存のドライバモデルを調べよう

カーネルがドライバに提供する機能

  • 割り込み disable/enable
  • spin lock
  • タイマー
  • 割り込みハンドラ登録
  • 物理メモリ固定
  • DMA
  • 他のデバイスへのアクセス
    • ドライバが設定ファイルを読むなど。

カーネルのドライバ管理方法

  • devfs
    • ドライバが登録時に devfs に自分を publish する
    • これによりそのドライバに対する open/close/read/write が使えるようになる
  • ドライバがエクスポートした関数を適宜 call 。

空間

ドライバの一部をそれぞれカーネル空間、ユーザー空間におく事ができる(どういう意味においてかは不明)

ドライバがエクスポートすべきもの

デバイスドライバ: デバイスドライバを書く より引用。
カーネルはある既知のエントリポイントをコールすることによってドライバに対して通信します,
そしてそのエントリポイントはexportするように実装されなければなりません. このエントリポイントは

  • init_hardware()
    • システムのブート時にコールされ,ドライバの検出とハードウェアのリセットを行なう.
  • init_driver()
    • ドライバのロード時にコールされ,必要なシステムリソースを割り当てることができる.
  • uninit_driver()
    • ドライバがアンロードされる直前にコールされ,割り当てられたリソースを解放する ことができる.
  • publish_devices()
    • ドライバによってサポートされるデバイス名のリストを得るためにコールされる.
  • find_device()
    • 特定のデバイスに対するフック関数へのポインタのリストを得るためにコールされる.
  • api_version
    • このexportされる値はカーネルにどのドライバAPIのバージョンを意図して 書かれたかを報告し,あなたのソースコード中では常にB_CUR_DRIVER_API_VERSION として指定するべきである.

hook

  typedef struct {
      device_open_hook open;
      device_close_hook close;
      device_free_hook free;
      device_control_hook control;
      device_read_hook read;
      device_write_hook write;
      device_select_hook select;
      device_deselect_hook deselect;
      device_readv_hook readv;
      device_writev_hook writev;
   } device_hooks;

参考URL