E.5. sg ドライバ

カーネルソースにある下記のヘッダファイルが、sg ドライバに関連しています。

        /usr/src/linux/include/scsi/sg.h

Section E.1で指摘した通り、アプリケーションからの利用にあたっては、

    #include <linux/../scsi/sg.h>
のようにインクルードするのが最善です。

E.5.1. sg のコンパイルオプション

ここでは sg.h に定義してある内、ユーザが変更したいと思われるものをいくつか 挙げてあります。現状のデフォルトの値は、右側の{}内に表示してあります。

SG_SCATTER_SZ           {32768}
SG_DEF_RESERVED_SIZE    {SG_SCATTER_SZ}
SG_DEF_FORCE_LOW_DMA    {0}
SG_DEF_FORCE_PACK_ID    {0}
SG_DEF_KEP_ORPHAN       {0}
SG_MAX_QUEUE            {16}
SG_DEFAULT_RETRIES      {1}  # i.e. don't retry
SG_BIG_BUFF             {SG_DEF_RESERVED_SIZE}
SG_DEFAULT_TIMEOUT      {60 seconds}
SG_DEF_COMMAND_Q        {0 *}
SG_DEF_UNDERRUN_FLAG    {0}


* 新しい sg_io_hdr 構造体に基づく write()が検出されると、ファイルごとの
   ディスクリプタにおけるコピーは、すぐ 1 に変わります(つまり、コマンド
   キューが有効になる)。

E.5.2. sg の ioctl と ユーザインタフェース

下記の ioctl()はアルファベット順にリストしてあり、簡単な説明が右側に 書いてあります。(sg のドキュメントを参照)。


SG_EMULATED_HOST     [アダプタが ide-scsi かどうかを示す]
SG_GET_COMMAND_Q     [コマンドキューフラグの状態]
SG_GET_KEEP_ORPHAN   [中断された SG_IO keep orphan フラグの状態]
SG_GET_LOW_DMA       [「low dma フラグ」(i386 で <= 16 MB)の状態]
SG_GET_NUM_WAITING   [read()待ち応答数]
SG_GET_PACK_ID       [次に read()する pack_id 応答(無い場合は -1)]
SG_GET_REQUEST_TABLE [実行されたリクエストの配列を生成]
SG_GET_RESERVED_SIZE [予約バッファの現状の大きさ]
SG_GET_SCSI_ID       [中間レベルの SCSI_IOCTL_GET_IDLUN ioctl よりも少し
                      詳しい情報]
SG_GET_SG_TABLESIZE  [ホストの scatter gather テーブルの最大エントリー数]
SG_GET_TIMEOUT       [タイムアウトの生成(単位:ジフィー(jyffy。i386 で 10ms)]
SG_GET_TRANSFORM     [ide-scsi transform フラグの状態]
SG_IO                [SCSI コマンドを送り、応答を待つ]
SG_NEXT_CMD_LEN      [次のコマンドのコマンド長を変更]
SG_SCSI_RESET        [SCSI バス、デバイス、ホストにリセットを送る]
SG_SET_COMMAND_Q     [コマンドキューの状態を設定{old=0, new=1}]
SG_SET_DEBUG         [デバックレベルの設定{0}]
SG_SET_KEEP_ORPHAN   [SG_IO keep orphan フラグの設定 {0}]
SG_SET_FORCE_LOW_DMA [DMA buffer を low に強制(i386 で <= 16 MB) {0}]
SG_SET_FORCE_PACK_ID [pack_id で read()を実行{0}]
SG_SET_RESERVED_SIZE [デフォルトのバッファサイズを変更
                      {SG_DEF_RESERVED_SIZE}]
SG_SET_TIMEOUT       [現在のタイムアウトを変更{60 secs} ]
SG_SET_TRANSFORM     [ide-scsi の ATAPI transform フラグ {0}]

open()    [認識する O_ フラグ: O_RDONLY, O_RDWR, O_EXCL, O_NONBLOCK]
close()
read()
write()
ioctl()
poll()    [O_NONBLOCK モードの時に使用]
fasync()  [read() に対する SIGIO シグナル生成を有効に]