API解説部分の抜粋です。記事の前半部分はやや冗長かつ一部内容がobsoleteになっていて個別の解説として再掲する意味が低いのと、長くて公開用に整理するのがめんどくさいという理由で手をつけていません。Webでの公開にあたり投げやりなhtml化を含め一部の表記は見直していますが、基本的にAPI解説としては当時のソースのままであり、最新のNetBSDバージョンにおける変更には追従していません。本テキストの著作権は筒井泉が有しています。obsoleteな不正確な情報が拡散するのもあまりよろしくないので、転載は控えて下さい。マニュアルの冒頭には次のように書かれている。areas."直訳すれば、「バス上のメモリおよびレジスタ領域に対する機種に依存しないアクセス方法を提供するために存在する」となる。マニュアルの記述を借りて要点をまとめると次のようになる。内に詳しく述べられているが、ここで簡単に触れておく。いう引数が用いられる。sys/arch/${MACHINE}/include/bus.h)の中で定義されている。多くのデバイスのマニュアルを見ればわかるが、デバイスを操作する際に必要なのはデバイスのレジスタやメモリのアドレスではなくてそれらのオフセットだけである。先頭のレジスタに対するアクセスであるが、両者の違いはアクセスを行なうアドレス領域とそのアクセス方法である。各アクセスに使用する関数において、アクセス方法、アクセス領域、オフセットの3つをセットで指定してやれば、一つのソースで複数の機種あるいは複数のバスの同一のデバイスに対応できることになる。定義し、その2つとオフセットをアクセスに用いる関数に対して指定することで機種非依存なデバイスドライバの記述を実現している。具体的に何なのか、ということはなかなか難しいと思う[注24]。APIを使わなければならないか」といったことが理解しにくいのではないかと思う。関数の実装について触れてみることにする。APIの目的なのだから、その中身がわかりにくいのは当然といえば当然である。i386における実装まずはもっともユーザーになじみが深いであろうi386の実装を見てみよう。記述は次のとおりである。種類、すなわちアクセス方法としては2種類のみ定義されているということである。記述は以下のとおりである。u_long型(つまりi386では32ビット整数)であるという以上のことはわからない。関数[注26]の実装を見る必要がある。次のようにdefineされている。(hp))--------------------------------------------------------------------------------つまりマップ関数は1種類のみである。あり次のような内容である。I/Oアドレスそのものである。入れられる値は引数として渡された物理アドレスに対応するカーネルの仮想アドレスである。定義は次のとおりである。メモリ直接のいずれかを選択するのに使われている。オフセット値を足したアドレスに対するアクセスを行っていることになる。従来からあるi386とAMDの新しい64ビットプロセッサであるAMD64と共有できるソースファイルを置くためのディレクトリとして最近作成された。定義されているマクロで、対応するメモリスペースの物理アドレスをこの仮想アドレスに変換する。中にあるが、この関数では新たにカーネル仮想アドレスを割り当ててそこに指定された物理アドレスをマップしている。次に普通のユーザーにはほとんど縁がないと思われるarcの実装を見てみる。arcはCPUがMIPSであるがISAを持っているとか、仮想アドレス空間は32ビットであるにも関わらず物理アドレス空間は64ビットありPCIのアドレス空間が物理アドレスの4G以降の領域に配置されているなど、普通でない部分が満載のマシンである[注28]。定義は次のとおりである。bus_space_map()系の関数が含まれている。アクセス系の関数は一つだけであるということが推測できる。定義は次のとおりである。関数の実装を見る必要がある。バスによって異なるものになる。