EN JA
BUS_SPACE(9)
BUS_SPACE(9) FreeBSD Kernel Developer's Manual BUS_SPACE(9)

名称

bus_space, bus_space_barrier, bus_space_copy_region_1, bus_space_copy_region_2, bus_space_copy_region_4, bus_space_copy_region_8, bus_space_copy_region_stream_1, bus_space_copy_region_stream_2, bus_space_copy_region_stream_4, bus_space_copy_region_stream_8, bus_space_free, bus_space_map, bus_space_read_1, bus_space_read_2, bus_space_read_4, bus_space_read_8, bus_space_read_multi_1, bus_space_read_multi_2, bus_space_read_multi_4, bus_space_read_multi_8, bus_space_read_multi_stream_1, bus_space_read_multi_stream_2, bus_space_read_multi_stream_4, bus_space_read_multi_stream_8, bus_space_read_region_1, bus_space_read_region_2, bus_space_read_region_4, bus_space_read_region_8, bus_space_read_region_stream_1, bus_space_read_region_stream_2, bus_space_read_region_stream_4, bus_space_read_region_stream_8, bus_space_read_stream_1, bus_space_read_stream_2, bus_space_read_stream_4, bus_space_read_stream_8, bus_space_set_multi_1, bus_space_set_multi_2, bus_space_set_multi_4, bus_space_set_multi_8, bus_space_set_multi_stream_1, bus_space_set_multi_stream_2, bus_space_set_multi_stream_4, bus_space_set_multi_stream_8, bus_space_set_region_1, bus_space_set_region_2, bus_space_set_region_4, bus_space_set_region_8, bus_space_set_region_stream_1, bus_space_set_region_stream_2, bus_space_set_region_stream_4, bus_space_set_region_stream_8, bus_space_subregion, bus_space_unmap, bus_space_write_1, bus_space_write_2, bus_space_write_4, bus_space_write_8, bus_space_write_multi_1, bus_space_write_multi_2, bus_space_write_multi_4, bus_space_write_multi_8, bus_space_write_multi_stream_1, bus_space_write_multi_stream_2, bus_space_write_multi_stream_4, bus_space_write_multi_stream_8, bus_space_write_region_1, bus_space_write_region_2, bus_space_write_region_4, bus_space_write_region_8, bus_space_write_region_stream_1, bus_space_write_region_stream_2, bus_space_write_region_stream_4, bus_space_write_region_stream_8, bus_space_write_stream_1, bus_space_write_stream_2, bus_space_write_stream_4, bus_space_write_stream_8バス空間操作関数

書式

#include < machine/bus.h>

int
bus_space_map( bus_space_tag_t space, bus_addr_t address, bus_size_t size, int flags, bus_space_handle_t *handlep);

void
bus_space_unmap( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t size);

int
bus_space_subregion( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, bus_size_t size, bus_space_handle_t *nhandlep);

int
bus_space_alloc( bus_space_tag_t space, bus_addr_t reg_start, bus_addr_t reg_end, bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, bus_addr_t *addrp, bus_space_handle_t *handlep);

void
bus_space_free( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t size);

uint8_t
bus_space_read_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint16_t
bus_space_read_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint32_t
bus_space_read_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint64_t
bus_space_read_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint8_t
bus_space_read_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint16_t
bus_space_read_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint32_t
bus_space_read_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

uint64_t
bus_space_read_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset);

void
bus_space_write_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t value);

void
bus_space_write_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t value);

void
bus_space_write_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t value);

void
bus_space_write_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t value);

void
bus_space_write_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t value);

void
bus_space_write_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t value);

void
bus_space_write_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t value);

void
bus_space_write_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t value);

void
bus_space_barrier( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, bus_size_t length, int flags);

void
bus_space_read_region_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_read_region_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_read_region_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_read_region_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_read_region_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_read_region_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_read_region_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_read_region_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_write_region_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_write_region_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_write_region_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_write_region_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_write_region_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_write_region_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_write_region_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_write_region_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_copy_region_1( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_2( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_4( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_8( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_stream_1( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_stream_2( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_stream_4( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_copy_region_stream_8( bus_space_tag_t space, bus_space_handle_t srchandle, bus_size_t srcoffset, bus_space_handle_t dsthandle, bus_size_t dstoffset, bus_size_t count);

void
bus_space_set_region_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t value, bus_size_t count);

void
bus_space_set_region_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t value, bus_size_t count);

void
bus_space_set_region_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t value, bus_size_t count);

void
bus_space_set_region_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t value, bus_size_t count);

void
bus_space_set_region_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t value, bus_size_t count);

void
bus_space_set_region_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t value, bus_size_t count);

void
bus_space_set_region_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t value, bus_size_t count);

void
bus_space_set_region_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t value, bus_size_t count);

void
bus_space_read_multi_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_read_multi_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_read_multi_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_read_multi_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_read_multi_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_read_multi_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_read_multi_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_read_multi_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_write_multi_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_write_multi_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_write_multi_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_write_multi_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_write_multi_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t *datap, bus_size_t count);

void
bus_space_write_multi_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t *datap, bus_size_t count);

void
bus_space_write_multi_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t *datap, bus_size_t count);

void
bus_space_write_multi_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t *datap, bus_size_t count);

void
bus_space_set_multi_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t value, bus_size_t count);

void
bus_space_set_multi_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t value, bus_size_t count);

void
bus_space_set_multi_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t value, bus_size_t count);

void
bus_space_set_multi_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t value, bus_size_t count);

void
bus_space_set_multi_stream_1( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint8_t value, bus_size_t count);

void
bus_space_set_multi_stream_2( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint16_t value, bus_size_t count);

void
bus_space_set_multi_stream_4( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint32_t value, bus_size_t count);

void
bus_space_set_multi_stream_8( bus_space_tag_t space, bus_space_handle_t handle, bus_size_t offset, uint64_t value, bus_size_t count);

解説

bus_space 関数は、バスメモリとレジスタ領域をマシンから独立してアクセスをデバイスドライバに許すために存在しています。この文書で説明されたすべての関数とタイプは、 < machine/bus.h> ヘッダファイルを含むことによって使用することができます。

多くの共通デバイスが、複数のアーキテクチャで使用されますが、アーキテクチャ上の制限のためにそれぞれ異なってアクセスされます。例えば、あるシステムの I/O 空間にマップされるデバイスは、2 つ目のシステムのメモリ空間にマップされるかもしれません。 3 つ目のシステムでは、アーキテクチャ上の制限で、必要なレジスタをアクセスする (例えば、非線形のレジスタ空間を作成します) 方法が変更されるかもしれません。ある場合には、単一のドライバは、単一のシステムかアーキテクチャの複数の方法で同じタイプのデバイスにアクセスする必要があるかもしれません。 / bus_space 関数の目標は、単一のドライバソースファイルが異なったシステムアーキテクチャで 1 組のデバイスを操作できるようにし、単一のドライバオブジェクトファイルが単一のアーキテクチャの複数のバスタイプで 1 組のデバイスを操作することができるようにすることです。

すべてのバスが、この文書で説明されたすべての機能を実装しなければならないというわけではありませんが、バスによって操作が論理的にサポートされているなら、それは奨励されます。未実装の関数は、できれば、コンパイル時エラーを引き起こすべきです。

この文書で説明されたすべてのインタフェース定義は、関数プロトタイプとして示され、あたかもそれらが関数でであることが必要であるかのように、議論されます。実装に関して、これらのインタフェースのプロトタイプで示された (タイプチェックされる) バージョンを実装することが奨励されますが、適切であるなら、マクロとしてそれらを実装することもできます。マシン依存タイプ、変数と関数は、マシンから独立しているタイプと関数との混乱を避けるために < machine/bus.h> で明確にされるべきであり、できれば、明らかにマシン依存であるような名前を付けるべきです。

コンセプトとガイトライン

バス空間は、マシン依存コードだけで作成することができる、バス空間タグで説明されます。与えられたマシンは、いくつかの異なったタイプのバス空間 (例えば、メモリ空間と I/O 空間) があり、その結果、複数の異なったバス空間タグを提供します。マシンの個々のバスかデバイスは、2 個以上のバス空間タグを使用します。例えば、ISA デバイスは、ISA メモリ空間タグと ISA I/O 空間タグが与えられます。アーキテクチャには、例えば複数の異なったホストバスインタフェースチップセットのために、同じタイプの空間を表すいくつかの異なったタグがあります。

バス空間の範囲はバスアドレスとバスサイズによって記述されます。バスアドレスはバス空間の範囲の開始を記述します。バスサイズはバイト単位の範囲のサイズを記述します。バイトアドレス可能でないバスは、適切に整列されたアドレスと適切に丸められたサイズでバス空間の範囲の使用を必要とします。

バス空間の領域へのアクセスは、通常、バス空間の特定の範囲をマップすることによって作成される、バス空間ハンドルを使用して容易に行えます。また、ハンドルは、割り付け関数の呼び出し側によって指定された領域内の実装によって取り出される実際の場所である、バス空間の範囲を割り付けてマップすることによって作成されます。

すべてのバス空間アクセス関数は、1 つのバス空間タグ引数、少なくとも 1 つのハンドル引数、および少なくとも 1 つのオフセット引数 (バスサイズ) を必要とします。バス空間タグは空間を指定し、各ハンドルは空間の領域を指定し、そして、各オフセットはアクセスされる実際の (複数の) 場所の領域中のオフセットを指定します。オフセットは、バイト単位で与えられますが、バスは整列を強制されます。与えられたハンドルに関連してデータをアクセスするために使用されるオフセットは、アクセスされるすべてのデータがハンドルが記述するマップされた領域になければなりません。その領域の外でデータにアクセスしようとすることは、エラーです。

いくつかのアーキテクチャのメモリシステムは、メモリとデバイスアクセスの性能を向上させるためにバッファリングを使用するので、バス空間の読み込み書き込みストリームに“barriers” (バリア) を作成するために使用できるメカニズムがあります。 3 つのタイプのバリアがあります: 読み込み、書き込みと読み込み/書き込みです。読み込みバリアの前の領域で開始されるすべての読み込みは、任意の読み込みの前で読み込みバリアが開始された後に完了していなければなりません。 (類似の要件は、書き込みバリアでも真です。) 読み込み/書き込みバリアは、バリアが開始された後に任意の読み込みまたは書き込みの前にバリアが完了する前に開始されたすべての読み込みと書き込みが強制されます。 (訳注: 訳はあやしく、よくわかりません。) 正しく書かれたドライバは、すべての適切なバリアを含み、バリア操作によって課せられた順序での読み込み/書き込みだけを仮定します。

bus_space 関数で移植性のあるドライバを書こうとする人々は、システムが許容する最小量の仮定を行おうとするべきです。特に、システムが、アクセスされるバス空間アドレスが自然に整列される (すなわち、オフセットに追加されたハンドルのベースアドレスは、アクセスサイズの倍数です) ことを必要として、システムがポインタで整列チェックをおこなう (すなわち、読み込み書き込みされるオブジェクトへのポインタは適切に整列されたデータを指さなければなりません) ことを、彼らは予想するべきです。

それらが適切な引数で呼び出されると仮定される、 bus_space 関数の説明は、すべて下記で示されます。不正な引数、または範囲外 (例えば、与えられたハンドルが作成されたときマップされた領域の外のデータにアクセスする試み) の引数で呼び出されるなら、未定義の振る舞いとなります。その場合には、(パニックを通して) 故意に、または (ある他の手段で致命的なトラップを引き起こすことによって) 故意でなく引き起こすかもしれません、また、直ちに致命的でない不適当な操作が原因で引き起こすかもしれません。関数は、失敗の場合 void を返すか、または、失敗でないなら、バス空間から読み込まれるデータを返します (すなわち、明らかにエラーコードを返さない関数)。不正な引数が与えられる場合にだけ、それらは失敗するかもしれません、そして、その場合には、それらの振る舞いは未定義です。バイトのカウントを行う関数は、指定された count が 0 であるなら、未定義の結果となります。

タイプ

いくつかのタイプが、ドライバで bus_space 関数の使用を容易にするために < machine/bus.h> で定義されています。

bus_addr_t

bus_addr_t タイプは、バスアドレスを記述するために使用されます。それはアーキテクチャで使用に適した最も大きいバスアドレスを保持することができる符号なし整数タイプでなければなりません。このタイプは、バス空間をマップして、アンマップするとき主に使用されます。

bus_size_t

bus_size_t タイプは、バス空間の範囲のサイズを記述するために使用されます。それはアーキテクチャで使用に適した最も大きいバスアドレスの範囲のサイズを保持することができる符号なし整数タイプでなければなりません。このタイプは、空間アクセス操作を実行するとき、領域とオフセットを領域にマップするときにサイズを記述する bus_space 関数のほとんどすべてによって使用されます。

bus_space_tag_t

bus_space_tag_t タイプは、マシンの特別のバス空間を記述するために使用されます。その内容は、マシン依存であり、マシンから独立したコードによって不透明 (サイズ及び形がわからない) であると見なされるべきです。このタイプは、それらが操作される空間を指定する、すべての bus_space 関数によって使用されます。

bus_space_handle_t

bus_space_handle_t タイプは、バス空間の範囲にマッピングを記述するために使用されます。その内容は、マシン依存であり、マシンから独立したコードによって不透明 (サイズ及び形がわからない) であると見なされるべきです。このタイプは、バス空間アクセス操作を実行するときに使用されます。

バス空間のマッピングとアンマッピング

このセクションは、これらの関数の NetBSD バージョンに特有であり、 FreeBSD バージョンに適用されないかもしれません。

バス空間は、それを使用することができる前にマップしなければならず、必要でなくなったときに、アンマップされるべきです。 bus_space_map() と bus_space_unmap() 関数は、これらのケーパビリティ (機能) を提供します。

いくつかのドライバは、既にマップしているバス空間のサブ領域を別のドライバまたはドライバ中のモジュールに渡すことができる必要があります。 bus_space_subregion() 関数は、そのようなサブ領域が作成されることを許可します。

bus_space_map( space, address, size, flags, handlep)

bus_space_map() 関数は、 space, address, と size 引数で指定されたバス空間の領域をマップします。成功すれば、0 を返し、マップしている領域にアクセスするために使用することができるハンドルを handlep によって指されたバス空間ハンドルに入れます。失敗するなら、0 以外を返し、 handlep によって指されたバス空間ハンドルは未定義の状態のままとなります。

flags 引数は、空間がマップされる方法を制御します。サポートされたフラグは次を含みます:

BUS_SPACE_MAP_CACHEABLE
アクセスが、システムでキャッシュされるか、そして/または、プリフェッチすることができるように空間をマップしようとします。このフラグが指定されないなら、実装は、キャッシュまたはプリフェッチされないように空間をマップするべきです。

このフラグは、後方互換性のためのすべての実装では、1 の値でなければなりません。

BUS_SPACE_MAP_LINEAR
通常のメモリアクセス方法 (例えば、ポインタの参照解除と構造体アクセス) で直線的に内容をアクセスすることができるように空間をマップしようとします。ソフトウェアでメモリデバイス、例えば、フレームバッファ、に直接アクセスしたいとき、これは役に立ちます。このフラグが指定され、線形マップが可能でないなら、 bus_space_map() の呼び出しは失敗するべきです。このフラグが指定されないなら、システムは最も便利ないかなる方法でも空間をマップすることができます。

フラグのすべての組み合わせが意味があるか、またはすべての空間でサポートされるというわけではありません。例えば、 BUS_SPACE_MAP_CACHEABLE は、多くのシステムの I/O ポート空間で使用されるとき、無意味であり、いくつかのシステムでは、 BUS_SPACE_MAP_CACHEABLE のない BUS_SPACE_MAP_LINEAR は、決して動作しません。空間がどのようにマップされるべきであるか (例えば、PCI メモリマッピングレジスタの“prefetchable”ビット) に関してシステムハードウェアまたはファームウェアがヒントを提供するとき、それらのヒントは最大の互換性のために追随されるべきです。いくつかのシステムでは、満たすことができないマッピング (例えば、システムがキャッシュ可能なものを提供することだけができるとき、キャッシュ不可能なマッピングの要求) を要求すると、その要求は失敗を引き起こします。

いくつかの実装は、いくつかまたはすべてのバス空間のためのバス空間の使用の経過を追い、複製の割り付けを拒否します。 ISA と VME のような、スロット特有の空間アドレス付けの概念がないバス空間のために、そしてそれらの空間 (例えば、ISA メモリと I/O 空間で共存している EISA、PCI メモリと I/O 空間) で共存する空間のために、これは奨励されます。

マップしている領域は、バス上にデバイスがない領域を含みます。それらの領域の空間がアクセスされているなら、結果はバスに依存しています。

bus_space_unmap( space, handle, size)

bus_space_unmap() 関数は、 bus_space_map() でマップされたバス空間の領域をアンマップします。領域をアンマップするとき、指定された size は、その領域をマップするとき bus_space_map() に与えられたサイズと同じであるべきです。

bus_space_unmap() がハンドルで呼び出された後は、そのハンドルはもう有効ではありません。 (ハンドルのコピーが作られたなら、それらのどちらかはもう有効ではありません。)

この関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすはずのソフトウェアバグを示しています。その場合には、 bus_space_unmap() は決して返りません。

bus_space_subregion( space, handle, offset, size, nhandlep)

bus_space_subregion() 関数は、バス空間の既にマップしている領域のいくつかのサブ領域への新しいハンドルを作成する便利な関数です。新しいハンドルによって記述されたサブ領域は、 size によって与えられたサイズで handle によって記述された領域中のバイトオフセット offset で始まり、元の領域の中に完全に含まれなければなりません。

成功するなら、 bus_space_subregion() は 0を返し、 nhandlep によって指されるバス空間ハンドルに入れられます。失敗するなら、0 以外を返して、バス空間ハンドルは未定義の状態で nhandlep によって指されたままとなります。いずれにしても、 handle によって記述されたハンドルは、有効なままで残り、変更されません。

ハンドルが bus_space_subregion() によって作成されている状態で行われるとき、ハンドルは、放棄されるべきです。どんな状態でも、 bus_space_unmap() をハンドルで使用するべきではありません。そうするのは空間で行われるどんなリソース管理も混乱させ、結果は未定義の振る舞いとなります。 bus_space_unmap() または bus_space_free() がハンドルで呼び出されるとき、そのハンドルのすべてのサブ領域は無効になります。

バス空間の割り付けと解放

このセクションは、これらの関数の NetBSD バージョンに特有であり、 FreeBSD バージョンに適用されないかもしれません。

いくつかのデバイスは、バス空間がデバイス使用のためのオペレーティングシステムによって割り付けられることが必要であるか、または許可します。デバイスがもう空間を必要としないとき、オペレーティングシステムは他のデバイスが使用するためにそれを解放するべきです。 bus_space_alloc() と bus_space_free() 関数は、これらのケーパビリティ (機能) を提供します。

bus_space_alloc( space, reg_start, reg_end, size, alignment, boundary, flags, addrp, handlep)

bus_space_alloc() 関数は、与えられた制約に対応している、 size によって与えられたサイズでバス空間の領域を割り付けてマップします。成功するなら、0 を返し、割り付けられた領域のバス空間アドレスで addrp によって指されたバスアドレスに入れ、その領域をアクセスするために使用することができるハンドルで handlep によって指されたバス空間ハンドルに入れます。失敗するなら、0 以外を返し、 addrp によって指されたバスアドレスと、未定義の状態の handlep によって指されたバス空間ハンドルはそのままとなります。

割り付けの制約は、 reg_start, reg_end, alignmentboundary パラメータで与えれらます。割り付けられた領域は、 reg_start の以降で始まり、 reg_end の以前で終ります。 alignment 制約は、2 の冪乗でなければなりません、そして、割り付けられた領域は、2 の冪乗の偶数の倍数であるアドレスで始まります。 boundary 制約は、0 以外であるなら、 first address in region / boundarylast address in region / boundary と同じ値を持てるように、割り付けられることを確実にします。制約を満足することができないなら、 bus_space_alloc() は失敗します。決して満足できない (例えば、 sizeboundary より大きい) 1 組の制約を指定することはエラーです。

flags パラメータは、 bus_space_map() への同様に指定されたパラメータと同じで、同じフラグの値が使用されるべきであり、同じ意味があります。

bus_space_alloc() によって作成されたハンドルは、 bus_space_free() でのみ解放されるべきです。それらで bus_space_unmap() を使用する試みは、未定義の振る舞いを引き起こします。 bus_space_subregion() 関数は、 bus_space_alloc() によって作成されたハンドルで使用することができます。

bus_space_free( space, handle, size)

bus_space_free() 関数は、 bus_space_alloc() でマップされ割り付けられたバス空間の領域をアンマップして、解放します。領域をアンマップするとき、指定された size は領域を割り付けるとき bus_space_alloc() に与えられたサイズと同じであるべきです。

bus_space_free() がハンドルで呼び出された後は、そのハンドルはもう有効ではありません。 (コピーがハンドルで作られたなら、どちらかは、もう有効ではありません。)

この関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、 bus_space_free() は決して返りません。

単一データ項目の読み込みと書き込み

バス空間にアクセスする最も簡単な方法は、単一のデータ項目を読み込むか、書き込むことです。 bus_space_read_N() と bus_space_write_N() 関数ファミリは、それらのアクセスサイズをサポートするバスで 1、2、4 と 8 バイトのデータ項目を読み込み書き込みする能力を提供します。

bus_space_read_1( space, handle, offset)

bus_space_read_2( space, handle, offset)

bus_space_read_4( space, handle, offset)

bus_space_read_8( space, handle, offset)

bus_space_read_N() 関数ファミリは、 space で指定されたバス空間の handle で指定された領域の offset で指定されたオフセットから 1、2、4 または 8 バイトのデータ項目を読み込みます。読み込まれる位置は、 handle で指定されたバス空間領域内になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、読み込まれるデータ項目のサイズの倍数であるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを読み込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_read_N() 関数によって行われた読み込み操作は、指令が、 bus_space_barrier() 関数の使用によって実行されないなら、他の保留中 (pending) の読み込みと書き込みに関して異常に実行されるかもしれません。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

bus_space_write_1( space, handle, offset, value)

bus_space_write_2( space, handle, offset, value)

bus_space_write_4( space, handle, offset, value)

bus_space_write_8( space, handle, offset, value)

bus_space_write_N() 関数ファミリは、 space で指定されたバス空間の handle で指定された領域の offset で指定されたオフセットに 1、2、4 または 8 バイトのデータ項目を書き込みます。書き込まれる位置は、 handle で指定されたバス空間領域内になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、書き込まれるデータ項目のサイズの倍数であるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを書き込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_write_N() 関数によって行われた書き込み操作は、指令が、 bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

バリア

あらゆる操作でバス活動を避けるために高性能バッファリング実装を許可するために、読み込みと書き込みの順序は、必要であるときに、ドライバによって明確に指定されるべきです。 bus_space_barrier() 関能はその能力を提供します。

bus_space_barrier( space, handle, offset, length, flags)

bus_space_barrier() 関数は、 space で指定された空間に handle で指定された領域の ( offsetlength パラメータで記述される) 指定されたサブ領域のためのバス空間の読み込みと書き込み操作の順序が強制されます。

flags 引数は、どんなタイプの操作が指令されるかかを制御します。サポートされたフラグは次の通りです:

BUS_SPACE_BARRIER_READ
同期読み込み操作。
BUS_SPACE_BARRIER_WRITE
同期書き込み操作。

読み込みと書き込み操作で強制的に指令するために (論理 (OR) して) それらのフラグを、組み合わすことができます。

バリア操作の前の領域に行われるすべての指定されたタイプの操作は、バリアの後に行われた任意の指定されたタイプの操作の以前に完了することが保証されます。

例: 2 つの単一バイトポート、(オフセット 0 での) 1 つの書き込み専用の入力ポートと (オフセット 1 での) 1 つの読み込み専用の出力ポートの仮想のデバイスを考慮します。デバイスの操作は次の通りです: データバイトは、入力ポートに書き込まれ、出力ポートからの読み込みよって、読み込まれる先頭である、スタックにデバイスによって置かれます。 2 つのデータバイトを正しくデバイスに書き込み、次に、それらの 2 つのデータバイトを読み込み戻すシーケンスは、次の通りです:

/* 
 * t と h は、マップしているデバイスの空間のためのタグと 
 * ハンドルです. 
 */ 
bus_space_write_1(t, h, 0, data0); 
bus_space_barrier(t, h, 0, 1, BUS_SPACE_BARRIER_WRITE);  /* 1 */ 
bus_space_write_1(t, h, 0, data1); 
bus_space_barrier(t, h, 0, 2, 
    BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE);     /* 2 */ 
ndata1 = bus_space_read_1(t, h, 1); 
bus_space_barrier(t, h, 1, 1, BUS_SPACE_BARRIER_READ);   /* 3 */ 
ndata0 = bus_space_read_1(t, h, 1); 
/* data0 == ndata0, data1 == ndata1 */

入力ポートへの 2 つの書き込みが順番に行われ、単一の書き込みに折りたたまないようにするために、2 番目の書き込みの前に終了する 1 番目の書き込みを確実にする最初のバリアが発行されます。これは、データバイトが正しく順番にデバイスに書き込まれることを確実にします。

入力ポートへの任意の読み込みの前に終了する出力ポートに書き込むことを確実にする 2 番目のバリアが発行され、その結果、すべての書き込みは、データが読み込まれる前に終了することを確実にします。これは、本当にデバイスから読み込まれた最初のバイトが書き込まれた最後のものであることを確実にします。

2 番目の読み込みの前に終了する 1 番目の読み込みを確実にする 3 番目のバリアが発行され、データバイトが正しく順番に読み込まれることを確実にします。

上記の例のバリアは、バス空間位置の絶対最小値番号をカバーするために指定されます。バリア操作がバス空間のデバイスの全体の範囲を (しばしばより簡単に) カバーすることは正しいことです。すなわち、0 のオフセットと全体の領域のサイズを指定するためです。

領域 (リージョン) 操作

いくつかのデバイスは、バス空間の領域としてマップされるバッファを使用します。しばしば、ドライバは、例えば、システムのより高いレベル、または出力される mbuf からネットワークへ渡すことができる mbuf へ、メモリへ、またはメモリから、それらのバッファの内容をコピーすることを必要とします。ドライバができるだけ効率的にこれを行うことを可能とするために、 bus_space_read_region_N() と bus_space_write_region_N() 関数ファミリが提供されます。

ドライバは、時々、バス空間の 1 つの領域を別のものにコピーするか、またはバス空間の領域のすべての位置に単一の値を含むように設定する必要があります。 bus_space_copy_region_N() 関数ファミリと bus_space_set_region_N() 関数ファミリにより、ドライバは、これらの操作を実行することができます。

bus_space_read_region_1( space, handle, offset, datap, count)

bus_space_read_region_2( space, handle, offset, datap, count)

bus_space_read_region_4( space, handle, offset, datap, count)

bus_space_read_region_8( space, handle, offset, datap, count)

bus_space_read_region_N() 関数ファミリは、 space で指定されたバス空間の handle で指定された領域にバイトオフセット offset で始まるバス空間から count 1、2、4 または 8 バイトデータ項目を読み込み、 datap で指定された配列にそれらを書き込みます。それぞれの連続したデータ項目は、(どの関数が使用されるかに依存して) 前のデータ項目の後のオフセット 1、2、4 または 8 バイトから読み込まれます。読み込まれるすべての位置は、 handle によって指定されたバス空間領域になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、読み込まれるデータ項目のサイズの倍数であるべきで、データ配列ポインタは適切に整列されるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを読み込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_read_region_N() 関数によって行われる読み込み操作は、任意の順序で実行されます。それらは、また、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_read_region_N() 関数によって実行された個々のバス空間位置の読み込みの間にバリアを挿入する方法はありません。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

bus_space_write_region_1( space, handle, offset, datap, count)

bus_space_write_region_2( space, handle, offset, datap, count)

bus_space_write_region_4( space, handle, offset, datap, count)

bus_space_write_region_8( space, handle, offset, datap, count)

bus_space_write_region_N() 関数ファミリは、 datap で指定された配列から count 1、2、4 または 8 バイトデータ項目を読み込み、 space で指定されたバス空間の handle で指定された領域のバイトオフセット offset で始まるバス空間にそれらを書き込みます。それぞれの連続したデータ項目は、(どの関数が使用されるかに依存して) 前のデータ項目の後のオフセット 1、2、4 または 8 バイトに書き込まれます。書き込まれるすべての位置は、 handle によって指定されたバス空間領域になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、書き込まれるデータ項目のサイズの倍数であるべきで、データ配列ポインタは適切に整列されるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを書き込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_write_region_N() 関数によって行われる書き込み操作は、任意の順序で実行されます。それらは、また、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_write_region_N() 関数によって実行された個々のバス空間位置の書き込みの間にバリアを挿入する方法はありません。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

bus_space_copy_region_1( space, srchandle, srcoffset, dsthandle, dstoffset, count)

bus_space_copy_region_2( space, srchandle, srcoffset, dsthandle, dstoffset, count)

bus_space_copy_region_4( space, srchandle, srcoffset, dsthandle, dstoffset, count)

bus_space_copy_region_8( space, srchandle, srcoffset, dsthandle, dstoffset, count)

bus_space_copy_region_N() 関数ファミリは、 space で指定されたバス空間の srchandle で指定された領域のバイトオフセット srcoffset で始まるエリアから、同じバス空間の dsthandle で指定された領域のバイトオフセット dstoffset で始まるエリアにバス空間の count 1、2、4 または 8 バイトデータ項目をコピーします。読み込みまたは書き込まれたそれぞれの連続したデータ項目は、 (どの関数が使用されるかに依存して) 前のデータ項目の後のオフセット 1、2、4 または 8 バイトがあります。読み込み書き込みされるすべての位置は、それらのそれぞれのハンドルによって指定されたバス空間領域になければなりません。

移植性のために、各ハンドルとその個別のオフセットで指定された領域の開始アドレスは、コピーされるデータ項目のサイズの倍数であるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータをコピーすることとなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_copy_region_N() 関数によって行われる読み込み書き込み操作は、任意の順序で実行されます。それらは、また、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_copy_region_N() 関数によって実行された個々のバス空間位置の読み込みまたは書き込みの間にバリアを挿入する方法はありません。

バス空間の単一の領域の異なったサブ領域の間の重なっているコピーは、 bus_space_copy_region_N() 関数によって正しく取り扱われます。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

bus_space_set_region_1( space, handle, offset, value, count)

bus_space_set_region_2( space, handle, offset, value, count)

bus_space_set_region_4( space, handle, offset, value, count)

bus_space_set_region_8( space, handle, offset, value, count)

bus_space_set_region_N() 関数ファミリは、 space で指定されたバス空間の handle で指定された領域のバイトオフセット offset で始まるバス空間に与えられた value から count 1、2、4 または 8 バイトデータ項目を書き込みます。それぞれの連続したデータ項目には、(どの関数が使用されるかに依存して) 前のデータ項目の後のオフセット 1、2、4 または 8 バイトがあります。書き込まれるすべての位置は、 handle によって指定されたバス空間領域になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、書き込まれるデータ項目のサイズの倍数であるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを書き込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_set_region_N() 関数によって行われる書き込み操作は、任意の順序で実行されます。それらは、また、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_set_region_N() 関数によって実行された個々のバス空間位置の書き込みの間にバリアを挿入する方法はありません。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

単一位置の複数回の読み込みと書き込み

いくつかのデバイスは、例えば、いくつかのイーサネットデバイスのパケットバッファ FIFO のような、データを通信するために複数の回の読み込みまたは書き込まれるバス空間の単一位置を実装します。ドライバができるだけ効率的にこれらのタイプのデバイスを操作できるようにするために、 bus_space_read_multi_N(), bus_space_set_multi_N() と bus_space_write_multi_N() 関数ファミリは提供されます。

bus_space_read_multi_1( space, handle, offset, datap, count)

bus_space_read_multi_2( space, handle, offset, datap, count)

bus_space_read_multi_4( space, handle, offset, datap, count)

bus_space_read_multi_8( space, handle, offset, datap, count)

bus_space_read_multi_N() 関数ファミリは、バス空間から space で指定されたバス空間の handle で指定された領域のバイトオフセット offsetcount 1、 2、4 または 8 バイトデータ項目を読み込み、 datap で指定された配列にそれらを書き込みます。それぞれの連続したデータ項目は、バス空間の同じ位置から読み込まれます。読み込まれるすべての位置は、 handle によって指定されたバス空間領域になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、読み込まれるデータ項目のサイズの倍数であるべきで、データ配列ポインタは適切に整列されるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを読み込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_read_multi_N() 関数によって行われる読み込み操作は、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_read_multi_N() 関数が複数回同じバス空間位置に読み込まれるので、それらはそのバス空間位置のそれぞれの連続した読み込みの間の暗黙の読み込みバリアを置きます。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

bus_space_write_multi_1( space, handle, offset, datap, count)

bus_space_write_multi_2( space, handle, offset, datap, count)

bus_space_write_multi_4( space, handle, offset, datap, count)

bus_space_write_multi_8( space, handle, offset, datap, count)

bus_space_write_multi_N() 関数ファミリは、 datap で指定された配列から count 1、2、4 または 8 バイトデータ項目を読み込み、 space で指定されたバス空間の handle で指定された領域のバイトオフセット offset で、バス空間にそれらを書き込みます。それぞれの連続したデータ項目は、バス空間の同じ位置に書き込まれます。書き込まれる位置は、 handle によって指定されたバス空間領域になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、書き込まれるデータ項目のサイズの倍数であるべきで、データ配列ポインタは適切に整列されるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを書き込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_write_multi_N() 関数によって行われる書き込み操作は、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_write_multi_N() 関数が複数回同じバス空間位置に書き込まれるので、それらはそのバス空間位置のそれぞれの連続した書き込みの間の暗黙の書き込みバリアを置きます。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

bus_space_set_multi_1( space, handle, offset, value, count)

bus_space_set_multi_2( space, handle, offset, value, count)

bus_space_set_multi_4( space, handle, offset, value, count)

bus_space_set_multi_8( space, handle, offset, value, count)

bus_space_set_multi_N() 関数ファミリは、 space で指定されたバス空間の handle で指定された領域のバイトオフセット offset で、 count 回数、バス空間に value を書き込みます。書き込まれる位置は、 handle によって指定されたバス空間領域になければなりません。

移植性のために、 handle とオフセットで指定された領域の開始アドレスは、書き込まれるデータ項目のサイズの倍数であるべきで、データ配列ポインタは適切に整列されるべきです。いくつかのシステムでは、この要件に従わないことは不正なデータを書き込むこととなり、他では、システムクラッシュを引き起こすかもしれません。

bus_space_set_multi_N() 関数によって行われる書き込み操作は、順序が bus_space_barrier() 関数の使用によって強制されないなら、他の保留中の読み込みと書き込み操作に関してバラバラの順序で実行されます。 bus_space_set_multi_N() 関数が複数回同じバス空間位置に書き込まれるので、それらはそのバス空間位置のそれぞれの連続した書き込みの間の暗黙の書き込みバリアを置きます。

これらの関数は決して失敗しません。 (例えば、引数エラーのために) 失敗するなら、それはパニックを引き起こすかもしれないソフトウェアバグを示します。その場合には、それらは決して返りません。

ストリーム関数

bus_space 関数の大部分は、ホストのバイト順とバスのバイト順の意味を含み、呼び出し側のためにどんな変換も処理します。しかしながら、ある場合には、ハードウェアは、呼び出し側が複数の単語、まだ変換されていないアクセスを使用したい、 FIFO またはある他のメモリ領域をマップするかもしれません。メモリ領域へのこれらのタイプのアクセスは、 bus_space_*_stream_N() 関数で行われるべきです。

bus_space_read_stream_1()
bus_space_read_stream_2()
bus_space_read_stream_4()
bus_space_read_stream_8()
bus_space_read_multi_stream_1()
bus_space_read_multi_stream_2()
bus_space_read_multi_stream_4()
bus_space_read_multi_stream_8()
bus_space_read_region_stream_1()
bus_space_read_region_stream_2()
bus_space_read_region_stream_4()
bus_space_read_region_stream_8()
bus_space_write_stream_1()
bus_space_write_stream_2()
bus_space_write_stream_4()
bus_space_write_stream_8()
bus_space_write_multi_stream_1()
bus_space_write_multi_stream_2()
bus_space_write_multi_stream_4()
bus_space_write_multi_stream_8()
bus_space_write_region_stream_1()
bus_space_write_region_stream_2()
bus_space_write_region_stream_4()
bus_space_write_region_stream_8()
bus_space_copy_region_stream_1()
bus_space_copy_region_stream_2()
bus_space_copy_region_stream_4()
bus_space_copy_region_stream_8()
bus_space_set_multi_stream_1()
bus_space_set_multi_stream_2()
bus_space_set_multi_stream_4()
bus_space_set_multi_stream_8()
bus_space_set_region_stream_1()
bus_space_set_region_stream_2()
bus_space_set_region_stream_4()
bus_space_set_region_stream_8()

これらの関数は、それらがバイト順の変換を提供しないことを除いて、ちょうどそれらのストリームでない対応物として定義されます。

互換性

bus_space インタフェース仕様の現在の NetBSD バージョンは、幅広い使用と採用された FreeBSD に入っているオリジナルの仕様とは若干異なります。関数名と引数のいくつかは、一貫性のために変更され、機能性が増強されました。

関連項目

bus_dma(9)

歴史

bus_space 関数は、(メモリと I/O 空間は異なった組の関数を通してアクセスされ) NetBSD 1.2 とは異なった形式で導入されました。関数は、 NetBSD 1.3 開発サイクルの初期に一般的な“空間”で動作するためにマージされ、多くのドライバは、それらを使用するように変換されました。この文書は、 NetBSD 1.3 開発サイクル期間の後で書かれ、仕様は、いくつかの一貫性の問題を修正して、いくつかの欠けている機能性を加えるために更新されました。

次にマニュアルページは、 FreeBSD が CAM SCSI ドライバとその後の展開のために持ち込まれたインタフェースのバージョンに適応されました。 FreeBSD bus_space バージョンは、 FreeBSD 3.0 で取り込まれました。

作者

bus_space インタフェースは、 NetBSD 開発者コミュニティによって設計され実装されました。主要な貢献者と実装者は、 Chris Demetriou, Jason ThorpeCharles Hannum ですが、 NetBSD 開発者とユーザコミュニティの残りの人々は開発で重要な役割を果たしました。

Justin Gibbs は、これらのインタフェースを FreeBSD に移植しました。

Chris Demetriou は、このマニュアルページを書きました。

Warner Losh は、 FreeBSD 実装のためにそれを変更しました。

バグ

このマニュアルは完全で正確にインタフェースを文書化していないかもしれません、そして、インタフェースの多くの部分が記述されていません。
June 13, 2005 FreeBSD