SCSI アダプタがブート中にプローブされる際、 SCSI バス上のデバイスが走査されます。 見つかったデバイスのうち、 タイプ CDROM (タイプ 5) あるいは WORM (タイプ 4) と応答したものは ドライバにアタッチされます。 Fx 2.1 以前のバージョンでは、 最初に見つかったデバイスは cd0 としてアタッチされ、その次が cd1 のようになっていました。 Fx 2.1 からは、デバイスが何番の cd ユニットとなるべきか指定できます。 カーネル設定の詳細については scsi(4) を参照して下さい。
システムユーティリティ disklabel(8) を用いて、合成されたディスクラベル構造体を読み出せます。 この構造体には、必要となる CD-ROM のサイズに関する正しい値が含まれます。
struct ioc_capability { u_long play_function; #define CDDOPLAYTRK 0x00000001 /* tracks/index 指定で再生可能 */ #define CDDOPLAYMSF 0x00000002 /* msf (分秒フレーム) 指定で再生可能 */ #define CDDOPLAYBLOCKS 0x00000004 /* ブロック指定で再生可能 */ #define CDDOPAUSE 0x00000100 /* 出力を一時停止可能 */ #define CDDORESUME 0x00000200 /* 出力を再開可能 */ #define CDDORESET 0x00000400 /* ドライブを完全にリセット可能 */ #define CDDOSTART 0x00000800 /* オーディオ開始可能 */ #define CDDOSTOP 0x00001000 /* オーディオ停止可能 */ #define CDDOPITCH 0x00002000 /* オーディオピッチ調整可能 */ u_long routing_function; #define CDREADVOLUME 0x00000001 /* ボリューム設定の読み出し可能 */ #define CDSETVOLUME 0x00000002 /* ボリュームの設定可能 */ #define CDSETMONO 0x00000100 /* 出力をモノラルに設定可能 */ #define CDSETSTEREO 0x00000200 /* 出力をステレオに設定可能 (デフォルト) */ #define CDSETLEFT 0x00000400 /* 出力を左のみに設定可能 */ #define CDSETRIGHT 0x00000800 /* 出力を右のみに設定可能 */ #define CDSETMUTE 0x00001000 /* 出力のミュート可能 */ #define CDSETPATCH 0x00008000 /* ダイレクトルーティング制御可能 */ u_long special_function; #define CDDOEJECT 0x00000001 /* トレーのオープン可能 */ #define CDDOCLOSE 0x00000002 /* トレーのクローズ可能 */ #define CDDOLOCK 0x00000004 /* トレーのロック可能 */ #define CDREADHEADER 0x00000100 /* 目次の読み出し可能 */ #define CDREADENTRIES 0x00000200 /* 目次エントリの読み出し可能 */ #define CDREADSUBQ 0x00000200 /* サブチャネル情報の読み出し可能 */ #define CDREADRW 0x00000400 /* サブコード R-W の読み出し可能 */ #define CDHASDEBUG 0x00004000 /* トレーがダイナミックデバッグ機能を持つ */ };
struct ioc_play_track { u_char start_track; u_char start_index; u_char end_track; u_char end_index; };
struct ioc_play_blocks { int blk; int len; };
struct ioc_play_msf { u_char start_m; u_char start_s; u_char start_f; u_char end_m; u_char end_s; u_char end_f; };
struct ioc_read_subchannel { u_char address_format; #define CD_LBA_FORMAT 1 #define CD_MSF_FORMAT 2 u_char data_format; #define CD_SUBQ_DATA 0 #define CD_CURRENT_POSITION 1 #define CD_MEDIA_CATALOG 2 #define CD_TRACK_INFO 3 u_char track; int data_len; struct cd_sub_channel_info *data; };
struct ioc_toc_header { u_short len; u_char starting_track; u_char ending_track; };
要求データは、 data が指す大きさ data_len の領域に格納されます。struct ioc_read_toc_entry { u_char address_format; u_char starting_track; u_short data_len; struct cd_toc_entry *data; };
struct ioc_patch { u_char patch[4]; /* 各チャネルに対し 1 要素が対応 */ };
struct ioc_vol { u_char vol[4]; /* 各チャネルに対し 1 要素が対応 */ };
struct ioc_pitch { short speed; };
ドライバ中のオーディオコードは SCSI-2 標準のオーディオコマンドのみサポートします。 多くの CD-ROM 製造業者はこの標準規格に従っていないため、 オーディオが動作しない CD-ROM ドライブが数多く存在します。 より一般的な「ダメな」 CD-ROM ドライブをサポートする作業も計画されていますが、 まだ実行に移されていません。
スケジューラは、ドライバが特定の LUN で消費するタイムクァンタムの 最小値と最大値を管理します。 最小値とは、たとえその LUN に処理中の I/O がない場合でも、 その LUN で費すことが保証されている最小時間量です。 最大値とは、他の LUN に処理中の I/O がある場合に、 ある LUN でチェンジャが費す最大時間量です。 他の LUN に処理中の I/O がない場合は、 ドライバはある LUN に対するアクセスに上限を設けません。
最小および最大タイムクァンタムはカーネルオプションや sysctl 変数を 通じて変更できます。カーネルオプションは以下の通り:
sysctl 変数は以下の通り:
ユーザは、sysctl 変数を通じて最小および最大タイムアウトを試し、 自分のチェンジャに最適な値を見つけるとよいでしょう。 一旦、自分のチェンジャに対する最適タイムアウトが決まれば、 それをカーネル設定ファイルに記述できます。
自分のシステムに LUN ベースのチェンジャが存在すれば、 ブートプロセスが進むに従って、そのチェンジャの様々な LUN に対する プローブメッセージが表示されることに気づくでしょう。 これは正常であり、チェンジャのスケジューリングコードによって引き起こされます。
現在のところ、異なる CD チェンジャに対して異なる最小および最大 タイムアウト値を設定する機構はありません。 カーネルオプションあるいは sysctl 変数で設定したタイムアウト値は システムにある LUN ベースの CD チェンジャ全てに適用されます。 このようなサポートを実装することは可能ですが、 少なくとも sysctl による実装はあまりエレガントではありません。 というのは、現在の sysctl コードではコンパイル後のノード追加を 取り扱うことができないためです。 それゆえ、動的に大きさを決定する sysctl 変数を用意し、 ユーザレベルのユーティリティを用いてタイムアウト値を取得ないし設定する ことになるでしょう。 カーネル設定ファイル中で、異なる CD デバイスに対して 別々のタイムアウトを指定できるようにするには、 config(8) を修正し、 固定的に記述した cd デバイスに 2 つのタイムアウト値をサポートするようにしなければ ならないかもしれません。