NetBSDとMI構造


このテキストはFreeBSD Press No.12 特集「BSDで動かそう 後編」のNetBSD関連記事のコラムとして掲載されたものです。Webでの公開にあたり投げやりなhtml化を含め一部の表記は見直していますが、記事の内容は当時のままであり、最新のNetBSDバージョンにおける変更には追従していません。記事の内容に関わるような大きな変更は入っていませんが……。

本テキストの著作権は筒井泉が有しています。obsoleteな不正確な情報が拡散するのもあまりよろしくないので、転載は控えて下さい。


NetBSDの特徴として 「いろんなマシンで動く」 ということがよく言われるが、これは実は正確ではなく 「どんなマシンでも動かせるような実装になっている」 ということのほうが本質である。[脚注1] そのような思想で実装されているからこそ、USB 担当、 ATAPI 担当、 UVM 担当、というように各開発者がそれぞれの領域で独立に開発を行っていてもお互い干渉せずに全体として改善していくことができ、それがマイナーなマシンを含む多くのアーキテクチャをサポートし続けることを可能にしているのである。「いろんなマシンで動く」というのは「どんなマシンに対しても適用できるように実装する」ということの結果に過ぎない。

NetBSD における MI な実装へのこだわりとして挙げられる例としては ISA SCSI アダプタの AHA-1542 のバウンスバッファサポートの話がある。4.3BSD/Net2 のライセンスに関する UCB と USL の訴訟が問題になっていた 1993年頃、つまり FreeBSD 1.5.1.1 や NetBSD 0.9 とかの時代の代表的な SCSIアダプタであった AHA-1542や BT-44xがISAのバスマスタDMAを利用するデバイスであったため本文で述べたように 16Mバイト以上のメモリを積んだマシンでは 16M以上のアドレスに直接 DMA転送が出来ないので使えない、という問題があった。

FreeBSD ではいち早くバウンスバッファ機構を実装することで FreeBSD 1.5.1.1 ではすでに 16M以上のマシンでも AHA-1542 をサポートしており、OpenBSD でも NetBSD からの分離直後に aha.c や関連の ISA のコードにバウンスバッファサポートが入れられていた。これに対し NetBSD で正式に AHA-1542 のバウンスバッファのサポートが入ったのは FreeBSD から遅れること実に 3年以上経過した 1998年の NetBSD-1.3 からであった。

実際には NetBSDにも aha.cに対するバウンスバッファのパッチは OpenBSD分離の前から存在していた。しかし NetBSD開発者の中では当初から「i386にも ISAにも SCSIにも依存しない一般的な DMA APIを作ってその上にバウンスバッファを実装すべきだ」という主張があり、そのための bus_dma APIを作るのに非常に長い時間を要した、というのが正式サポートが遅れた理由である。そこまでこだわっただけにその実装はかなり洗練されており、bus_dma導入時にはバウンスバッファを必要としていた aha 以外のドライバも同時に修正されたほか、最近ではドリームキャストのブロードバンドアダプタサポートの際にもMI側の rtl81x9.c のDMA周辺ルーチンはまったく変更の必要がなかった。一方、先に AHA-1542のバウンスバッファサポートを入れた FreeBSDや OpenBSDにおいて「正しい解」である bus_dma APIが導入されたのはずいぶん後の話であった。

このような思想を象徴する言葉として

"It doesn't work unless it's right."

ということが www.NetBSD.org 内のページに挙げられている。この NetBSDの精神は実用性や性能を重視する Linux や FreeBSD とは対照的である。中身なんかどうでもよくて使えるか使えないかだけを必要とする一般ユーザーからしてみればNetBSDはアカデミックだ(もっと平たく言えばユーザーに対するサポートが悪い)とかいうことになるが、開発者にとってはとことん実装にこだわって自分が納得するまで考えられるという意味で非常に楽しい環境だと言えるのではないだろうか。


[脚注1] http://www.NetBSD.org/about/system.htmlhttp://www.NetBSD.org/about/portability.html を参照。


NetBSDのページに戻る
tsutsui@ceres.dti.ne.jp