VMEやCAMACは特殊な入出力装置です。UNIXでは入出力装置もすべて特殊なファ イルとして扱われます。それぞれのデバイスにデバイスドライバーを書くこと によってカーネルのレベルで処理が行なえるようになります。それらの役割の 中で大きなものは、ユーザプロセスのメモリー空間にVMEのアドレス空間を割 り付けることと、モジュールの割り込みを処理することです。/devの下を見て ください。
% ls /dev/vme* /dev/vme16 /dev/vme16d32 /dev/vme24d16 /dev/vme32 /dev/vme32d32 /dev/vme16d16 /dev/vme24 /dev/vme24d32 /dev/vme32d16
などというのが見えます(DECstationの場合はvme[a-f]0)。それぞれ異なった VMEのアクセス方式を表しています。数字はそれぞれ使用するアドレス線の数 とデータ線の数を表しています。どのモードを使用する必要があるかは使うモ ジュールによって違います。
注意をしていただきたいのは、これらのデバイスは歴史的な理由から実際に VMEインターフェースを持っていないシステムにも形だけ残っていることがあ ります。SunOSの場合もそうです。ですからVMEボードを持ってきてこれらのデ バイスがlsで見えても実際にはインストールされていないことがあるので注意 してください。インストールされていない状態でVMEにアクセスしようとして も正しく働きません。インストールされているかどうかはdme sgなどで立ち上 げ時のデバイスドライバーの出力メッセージをみれば確認できます。例えば次 のような記述があるはずです。
FORCE SPARC CPU-3CE FORCE Solaris 1.1.1 Rev. B CPU-3CE VME Driver (nexus & memplus) Version 1.1 Master Window: 0x0-0xfffffff (a32map=0x0) Slave Window: 0x0-0xfffff (slavemap=0x80) A16 Mail Box: 0x0 (mbox=0x0) VME Interrupt Level Enable: 1, 2, 3, 4, 5, 6, 7, (intenable=0xfe) VME0 at SBus slot 0 0xfe00000 and SBus slot 4 0x1380000 pri 2, pri 3, pri 5, pri 7, pri 9, pri 11, pri 13
こういった記述がdmesgで表示されなければまだそのシステムにはVMEドライバー はインストールされていません。システム管理者にインストールをお願いして ください。
VMEをアクセスするためにはデバイスドライバーを呼び出すためファイルと してopenする必要があります。メモリーの割付や割り込みの処理などもopenで 得られたファイル記述子を通して行なわれます。
#include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/mman.h> int fd; caddr_t vme_ptr; #ifdef ultrix fd = open( "/dev/vmef0", O_RDWR | O_CREAT ); #else fd = open( "/dev/vme32d32", O_RDWR | O_CREAT ); #endif
以後、このファイル記述子fdを使ってメモリーを割り付けたり割り込みを操作 するためのioctlシステムコール呼出しを行ったりします。例文では#ifdefで DECstationの場合とSPA RCののったVMEモジュール(FORCE社のCPU-2CEなど)の 場合を取り上げています。