SPUFS
Section: Linux Programmer's Manual (7)
Updated: 2007-07-10
Index
JM Home Page
roff page
名前
spufs - SPU ファイルシステム
説明
SPU ファイルシステムは、Cell Broadband Engine アーキテクチャを実装した
PowerPC マシンにおいて、Synergistic Processor Unit (SPU) にアクセスする
ために使用される。
このファイルシステムでは、POSIX 共有メモリやメッセージキューに
似た名前空間が提供される。
ファイルシステムに書き込み許可を持つユーザは
spu_create(2)
を使って spufs のルートディレクトリに SPU コンテキストを作成できる。
各 SPU コンテキストは、あらかじめ定義されたファイル群を含む
ディレクトリとして表現される。
これらのファイルを使って、論理 SPU の状態を操作できる。
ユーザはこれらのファイルのアクセス許可を変更することはできるが、
ファイルの追加・削除を行うことはできない。
マウントオプション
- uid=<uid>
-
マウントポイントを所有するユーザを設定する。
デフォルトは 0 (root) である。
- gid=<gid>
-
マウントポイントを所有するグループを設定する。
デフォルトは 0 (root) である。
ファイル
spufs
のファイルは、ほとんどの場合
read(2)
や
write(2)
といった通常のシステムコールに対する標準的な振る舞いを示すが、
多くの場合通常のファイルシステムでサポートされている操作の一部分だけが
サポートされている。以下のリストでは、サポートされている操作と
それぞれのマニュアルページに書かれている標準的な振る舞いとの違いに
ついて説明する。
read(2)
操作に対応している全てのファイルは
readv(2)
にも対応している。また、
write(2)
操作に対応している全てのファイルは
writev(2)
にも対応している。
全てのファイルは、
access(2)
と
stat(2)
系の操作に対応しているが、
stat(2)
では、呼び出した際に返される
stat
構造体のフィールドのうち信頼できる情報が入っているのは
st_mode,
st_nlink,
st_uid,
st_gid
だけである。
全てのファイルは
chmod(2)/fchmod(2)
と
chown(2)/fchown(2)
の操作に対応しているが、
そのファイルが対応している操作と矛盾するアクセス許可を
付与することはできない (例えば、
wbox
ファイルに対する読み出しアクセスなど)。
現時点でのファイルは以下の通りである。
- /mem
-
SPU のローカルストレージの内容。
このファイルは通常の共有メモリファイルと同様にアクセスでき、
SPU のアドレス空間にはコードとデータの両方を格納できる。
オープンされた
mem
ファイルに可能な操作は以下である。
-
- read(2), pread(2), write(2), pwrite(2), lseek(2)
-
これらは通常通り動作するが、
ファイル末尾を越えての
lseek(2),
write(2),
pwrite(2)
に対応していない点だけが異なる。
ファイルサイズは SPU のローカルストレージのサイズであり、
通常は 256 キロバイトである。
- mmap(2)
-
mem
をプロセスのアドレス空間にマッピングすると、
プロセスのアドレス空間の一部として
SPU のローカル・ストレージにアクセスできるようになる。
- /mbox
-
SPU から CPU への通信用の一つ目のメールボックス。
このファイルは読み出し専用で、読み出しは 32ビット単位で行う。
このファイルは非停止 (non-blocking) モードでのみ使用でき、
poll(2)
であってもこのファイルで停止 (block) することはない。
オープンされた
mbox
ファイルに可能な操作は以下である。
-
- read(2)
-
count
が 4 より小さい場合、
read(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
メールボックスにデータがない場合、-1 が返り、
errno
が
EAGAIN
に設定される。データの読み出しに成功した場合、
4 バイトがデータバッファに格納され、返り値として 4 が返される。
- /ibox
-
SPU から CPU への通信用の二つ目のメールボックスである。
このファイルは一つ目のメールボックスファイルと似ているが、
停止 (blocking) I/O モードでの読み出しが可能である。したがって、
poll(2)
や同様のシステムコールを使って、このファイルを監視することができる。
オープンされた
ibox
ファイルに可能な操作は以下である。
-
- read(2)
-
count
が 4 より小さい場合、
read(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
メールボックスにデータがない場合、ファイルディスクリプタが
O_NONBLOCK
でオープンされていれば、返り値は -1 となり、
errno
は
EAGAIN
に設定される。
メールボックスにデータがない場合で、ファイルディスクリプタが
O_NONBLOCK
なしでオープンされていれば、
SPU が自分の割り込みメールボックスチャネル (interrupt mailbox channel)
に書き込みを行うまで
read(2)
は停止 (block) する。
データの読み出しに成功した場合、
4 バイトがデータバッファに格納され、返り値として 4 が返される。
- poll(2)
-
ibox
ファイルに対する
poll(2)
は、読み出しデータが利用可能になる度に
(POLLIN | POLLRDNORM)
を返す。
- /wbox
-
CPU から SPU への通信用のメールボックス。
このファイルは書き込み専用で、書き込みは 32ビット単位で行う。
メールボックスが一杯の場合、
write(2)
は停止 (block) し、
poll(2)
を使ってメールボックスに再度空きができるまで待つことができる。
オープンされた
wbox
ファイルに可能な操作は以下である。
-
- write(2)
-
count
が 4 より小さい場合、
write(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
メールボックスに空き領域がない場合、ファイルディスクリプタが
O_NONBLOCK
でオープンされていれば、返り値は -1 となり、
errno
は
EAGAIN
に設定される。
メールボックスに空き領域がない場合で、ファイルディスクリプタが
O_NONBLOCK
なしでオープンされていれば、
SPU が自分の PPE メールボックスチャネルから読み出しを行うまで
write(2)
は停止 (block) する。
データの書き込みに成功した場合、返り値として 4 が返される。
- poll(2)
-
wbox
ファイルに対する
poll(2)
は、書き込み用の空間が利用可能になる度に
(POLLOUT | POLLWRNORM)
を返す。
- /mbox_stat, /ibox_stat, /wbox_stat
-
これらのファイルは読み出し専用で、
各メールボックスの現在のキュー長を保持する。
具体的には、停止 (blocking) せずに、
mbox や ibox
から何ワードを読み出すことができ、
wbox
に何ワードを書き込むことができるか、ということである。
これらのファイルは 4 バイト単位でのみ読み出しが可能で、
ビッグ・エンディアンの整数値を返す。
オープンされた
*box_stat
ファイルに可能な操作は以下である。
-
- read(2)
-
count
が 4 より小さい場合、
read(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
それ以外の場合、データバッファに 4 バイトの値が書き込まれる。
この値は、各メールボックスにおいて停止せずに、または
EAGAIN
エラーなしで、読み出し可能なエレメント数
(mbox_stat
や
ibox_stat
の場合)、書き込み可能なエレメント数
(wbox_stat
の場合) である。
- /npc, /decr, /decr_status, /spu_tag_mask, /event_mask, /srr0
-
これらのファイルは SPU の内部レジスタを公開するものである。
値は、各レジスタの数値を含むアスキー文字列で表現される。
これらのファイルはデバッグ用として読み出し/書き込みの両モードで利用できるが、
プログラムの通常の操作はこれらのファイルに依存すべきではない。
なぜなら、これらのファイルのうち
npc
以外へのアクセスでは SPU コンテキストの保存が必須であり、
SPU コンテキストの保存は非常に効率が悪いからである。
-
これらのファイルの内容は以下の通り。
-
- npc
-
次のプログラムカウンタ
- decr
-
SPU Decrementer
- decr_status
-
Decrementer の状態
- spu_tag_mask
-
SPU の DMA 用の MFA タグマスク
- event_mask
-
SPU の割り込みのイベントマスク
- srr0
-
割り込みリターンアドレスレジスタ
-
これらのファイルに対して可能な操作は以下である。
-
- read(2)
-
read(2)
に渡された
count
がレジスタ値と改行 (newline) 文字 1 個を格納するのに必要な長さより短い場合、
同じファイルディスクリプタを続けて read することで、文字列全体を読み出すこと
ができる。この際、実行中の SPU タスクによりレジスタ値の変更の影響は受けない。
文字列全体が読み出されると、それ以降の read 操作では 0 バイトが返され、
新しい値を読み出すには新しいファイルディスクリプタをオープンする必要がある。
- write(2)
-
このファイルへの
write(2)
操作はレジスタ値を文字列で指定された値に設定する。
文字列の解釈は先頭から開始され、数字以外の文字が初めて登場するか、
バッファの末尾に達するまで行われる。
同じファイルディスクリプタへ続けて write を行うと、
後の write により前の設定が上書きされる。
- /fpcr
-
このファイルにより Floating Point Status and Control Register に
アクセスできる。このファイルは大きさ 4 バイトである。
fpcr
ファイルに可能な操作は以下である。
-
- read(2)
-
count
が 4 より小さい場合、
read(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
それ以外の場合、データバッファに 4 バイトの値が書き込まれる。
書き込まれる値は
fpcr
レジスタの現在の値である。
- write(2)
-
count
が 4 より小さい場合、
write(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
それ以外の場合、 4 バイトの値がデータバッファからコピーされ、
fpcr
レジスタの値が更新される。
- /signal1, /signal2
-
これらのファイルにより
SPU の二つのシグナル通知チャネル (signal notification channel) に
アクセスできる。
これらは 32 ビット単位の読み書きができる。
これらのファイルの一つに書き込みを行うと、その SPU の割り込みが
発生するトリガーとなる。
シグナルファイルへ書き込まれた値は、チャネル経由で SPU で読み出したり、
このファイル経由でホストのユーザ空間で読み出したりできる。
SPU が値を読み出した後では、値は 0 にリセットされる。
オープンされた
signal1
や
signal2
ファイルに可能な操作は以下である。
-
- read(2)
-
count
が 4 より小さい場合、
read(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
それ以外の場合、データバッファに 4 バイトの値が書き込まれる。
書き込まれる値は、指定されたシグナル通知レジスタの現在の値である。
- write(2)
-
count
が 4 より小さい場合、
write(2)
は -1 を返し、
errno
を
EINVAL
に設定する。
それ以外の場合、 4 バイトの値がデータバッファからコピーされ、
指定されたシグナル通知レジスタの値が更新される。
シグナル通知レジスタの更新には、レジスタ値を入力データで置き換えるモードと
以前の値と入力データのビット単位の OR をとった値に更新するモードがある。
どちらのモードになるかは、それぞれ
signal1_type,
signal2_type
ファイルの内容によって決まる。
- /signal1_type, /signal2_type
-
これらのファイルは、シグナル通知ファイル
signal1
と
signal2
の動作を変更する。
これらのファイルは数値を表すアスキー文字列を保持し、
読み出すと "1" か "0" のどちらかが得られる。
モード 0 (上書きモード) では、ハードウェアはシグナルチャネルの内容を
シグナルチャネルに書き込まれたデータで置き換える。
モード 1 (論理 OR モード) では、ハードウェアはシグナルチャネルに
書き込まれたビットを積算していく。
オープンされた
signal1_type
や
signal2_type
ファイルに可能な操作は以下である。
-
- read(2)
-
read(2)
に渡された
count
がレジスタの数値と改行 (newline) 文字 1 個を格納するのに必要な長さより
短い場合、同じファイルディスクリプタを続けて read することで、
文字列全体を読み出すことができる。
文字列全体が読み出されると、それ以降の read 操作では 0 バイトが返され、
新しい値を読み出すには新しいファイルディスクリプタをオープンする必要がある。
- write(2)
-
このファイルへの
write(2)
操作はレジスタ値を文字列で指定された値に設定する。
文字列の解釈は先頭から開始され、数字以外の文字が初めて登場するか、
バッファの末尾に達するまで行われる。
同じファイルディスクリプタへ続けて write を行うと、
後の write により前の設定が上書きされる。
例
- /etc/fstab entry
-
none /spu spufs gid=spu 0 0
関連項目
close(2),
spu_create(2),
spu_run(2)
Index
- 名前
-
- 説明
-
- マウントオプション
-
- ファイル
-
- 例
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 03:26:56 GMT, April 25, 2010