後編」のNetBSD関連記事のコラムとして掲載されたものです。Webでの公開にあたり投げやりなhtml化を含め一部の表記は見直していますが、基本的にAPI解説としては当時のソースのままであり、最新のNetBSDバージョンにおける変更には追従していません。本テキストの著作権は筒井泉が有しています。obsoleteな不正確な情報が拡散するのもあまりよろしくないので、転載は控えて下さい。API群はMIとMDの分離を行うために用意された抽象化されたデバイスアクセスのための関数である。使う」などという乱暴な説明だけでもデバイスドライバを書くだけならばあまり困らない。少なくとも既存のドライバを見ればそれほど難しい使い方が要求される部分は多くない。APIの内部的な構造も理解しておく必要がある。APIの実際の実装について簡単に説明する。具体的な例として、シリアルポートのデバイスドライバにおいてその中からUARTのチップである16550のドライバ内からチップ内のアドレス0にあるレジスタを読み込むという操作をすることを考えてみる。MIなドライバ上では、対象となるレジスタのアドレスも任意であるし、読み込みを行うための命令もバスやマシンによって異なったものになる。したがって、読み出しを行うAPIはデバイスのどのレジスタに対する操作であるかだけを引数とし、実際の読み出し方法や読み出すアドレスはそのデバイスが初期化された際(あるいはそのドライバがコンパイルされた際)に設定された各マシンやバスおよびデバイス固有の情報に基づいて切り替えられるようになっていなければならない。内に詳しく述べられているが、ここで簡単に触れておく。いう引数が用いられる。sys/arch/${MACHINE}/include/bus.h)の中で定義されている。アクセスの対象となるデバイスが接続されているマシンのバスの属性を定義する。mappedされたデバイス空間であるとかI/O空間にあるISAバスであるとかいうような属性に基づいて決められる。bus_space関数すべてを定義するための関数へのポインタを含む構造体へのポインタであったりと様々である。使われていない場合もある。アクセスの対象となるデバイスそのものの属性を定義する。持つ場合がほとんどである。long等の整数型である。構造体として定義されている。APIは大きく分けてマップ系の関数とアクセス系の関数の二つに分けられる。