Linux における SCSI プログラミン グ sg3-utils ソースコード解読. SCSI 規格の規定 大まかに以下の 3 層に分かれる – 物理層 – プロトコル層 – コマンド・セット 共通コマンド プロトコル ダイレクト・アクセス シーケンシャル・アクセス メディアチェンジャー パラレル.

Slides:



Advertisements
Similar presentations
プログラミング演習 II 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習 共用体( union type ) 共用体( union type ) 列挙 (enumerated type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、
Advertisements

Item 1:View C++ as a federation of languages. C++ はただの ”C のクラスがあるバージョン ” ではない → 例外安全 (29 項 ) 、テンプレート (41 項 ) 、オーバーロード等の導入によりデザインや目指すコードが 変化している プログラミング言語はあくまで言語.
10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ C プログラミング入門 総機 1 ( 月 1) 1.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
■プロセスとfileの関係 プロセスが一つファイルをオープンすると以下のようなデータ構造が作られる。
■ディレクトリエントリキャッシュ linuxではdentryという構造体に、ファイルパス名の情報を格納しメモリ上にキャッシングしている。
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
入 出 力 管 理 オペレーティングシステム 6/26/09.
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
Bottle/Pythonによる Webアプリ入門
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
Linuxカーネルについて 2014/01.
ファイル操作と文字列の利用.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
アスペクト指向プログラミングを用いたIDSオフロード
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
画像処理プログラムの説明.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
実行時情報に基づく OSカーネルのコンフィグ最小化
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
第16章 BOOTP:ブートストラップ・プロトコル
全体ミーティング 6月6日 島本 大輔(M2) 2006年6月6日(火).
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
1.情報機器について知ろう(p.8-9) 第1章 第1節
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
Ibaraki Univ. Dept of Electrical & Electronic Eng.
軽量な仮想マシンを用いたIoT機器の安全な監視
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 3 2 次元配列.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
プログラミング演習I 2003年7月2日(第11回) 木村巌.
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
ネットワーク・プログラミング Cプログラミングの基礎.
高度プログラミング演習 (11).
プログラミング 4 文字列.
ネットワーク・プログラミング 1対多のプロセス間通信.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
プログラミング 3 ポインタ(1).
Presentation transcript:

Linux における SCSI プログラミン グ sg3-utils ソースコード解読

SCSI 規格の規定 大まかに以下の 3 層に分かれる – 物理層 – プロトコル層 – コマンド・セット 共通コマンド プロトコル ダイレクト・アクセス シーケンシャル・アクセス メディアチェンジャー パラレル SCSI シリアル SCSI ファイバーチャネル 物理・電気層 コネクタ ケーブル シングル・エンドディファレンシャル

Linux での SCSI 制御 大まかに以下の 3 層に分かれる – 「高」レベルレイヤが SCSI 規格のコマンド・ セットの部分に接している – 「低」レベルレイヤがプロトコル層や物理・電 気層に接している – 「中間」レベルは「高」レベルと「低」レベル に共通のサービス層を提供する アプリケーションレベルの開発ではこれらの「高」レ ベルレイヤのドライバを用いて開発を行う。 「高」レベル 「中間」レベル SG (汎用ドライバ ) 「低」レベル ST ( テープドライバ ) SR(CDROM 等ドライバ ) SD( ディスクドライバ )

Linux での SCSI プログラミング SD( ディスクドライバ ) ・ SR(CDROM または DVD ドライバ ) ・ ST( テープドライバ ) での開 発 – 開発が可能であればこれらのドライバを使って開 発したほうが楽。 以下の場合は SG ドライバを使って開発 – 細かい SCSI 制御が必要な場合。 – 上記以外の種類の SCSI 機器を制御しなければいけ ないとき。 ( 例:テープライブラリ )

SG ドライバを用いたのプログ ラム開発の手法 最小限必要な include ファイル –/usr/include/scsi/scsi.h SCSI コマンドやステータス・バイト ( コマンド の返り値 ) 等を定義 –/usr/include/scsi/sg.h SG デバイスとアクセスするための ioctl システ ムコールの引数を定義

プログラム開発の大まかな開 発手順 SG デバイスを open(2) を O_RDWR の flag を付 けて開く。 –(Read only のデバイスでも O_RDWR を付ける ) sg_io_hdr 構造体を初期化して ioctl システム コールを呼び出す。 SG デバイスを close する。 エラーが発生したときの具体的内容は sg_io_hdr 構造体に保持されているので、エ ラー発生時には sg_io_hdr 構造体の中身を見 て処理をする。

少し楽に開発するには このままではエラー処理が大変面倒 sg3-utils のソースコードにある以下のファイ ルを用いると開発が楽になる。 –sg_linux.inc.h sg.h と scsi.h が /usr/include/scsi ディレクトリに無い場合 でもコンパイル出来るようにする為のラッパーファイル –sg_io_linux.h ・ sg_io_linux.c SCSI コマンド実行後の返り値 エラー発生時のエラー処理をするための関数等を定義し たファイル (Linux 依存 ) –sg_lib.h ・ sg_lib.c CDB( 後で説明 ) で定義されている情報を処理するコマン ド SCSI コマンドやステータス・バイトの定義 SCSI コマンドで入出力に使われるメモリを処理するコマ ンド SCSI 処理でエラーが発生したときに出力される Sense Data を処理するコマンド等を定義したファイル (Linux 非 依存 )

更に楽にするには 殆ど SCSI コマンドを呼び出すだけ Linux 以外の OS にも移植出来るように なる。 –sg_pt.h ・ sg_pt_linux.c sg_pt.h はさまざまな OS で同じ関数名で呼び出 すためのインクルードファイル sg_pt_linx.c(sg_pt_freebsd.c ・ sg_pt_solaris.c ・ sg_pt_osf1.c ・ sg_pt_win32.c) はその実際の処理の記述したファイル。 –sg_cmds.h sg_cmds_basic および sg_cmds_extra の両方の インクルードファイルを呼び出すファイル

更に楽にするには ( 続き) –sg_cmds_basic.h ・ sg_cmds_basic.c SCSI コマンドの中で比較的良く使われるコマ ンドおよびファイルのオープン・クローズ・エ ラー出力処理を定義したファイル –sg_cmds_extra.h ・ sg_cmds_extra.c SCSI コマンドの中で比較的使われる頻度が少 ないコマンドを定義したファイル

sg_io_hdr_t で設定するデータ 1) CDB(Command Descriptor Block ) – イニシエータ (SCSI ボード ) からターゲット (SCSI 機器 ) に操作要求を伝えるためのコマ ンド情報を示す。大体 6 ・ 10 ・ 12 バイトの 大きさ。必ず先頭バイトがオペレーション コード最終バイトがコントール・バイトと なる。 – サポートする SCSI コマンドは SCSI 機器毎 で異なる。詳しくはそれぞれの SCSI 機器 のハードウェアマニュアルを参照する。

sg_io_hdr_t で設定するデータ 1 ) CDB( 続き ) – コマンドの先頭アドレスとコマンドの長さ を sg_io_hdr_t の以下のメンバに設定 cmd_len –CDB を保持する配列の長さ cmdp –CDB を保持する配列を指すポインタ

sg_io_hdr_t で設定するデータ 2 ) SCSI コマンドで受け渡しするメモリ上の データ –SCSI コマンドでデータを送るとき 送るデータ内容の配列を設定する。 –SCSI コマンドでデータを受け取るとき 受け取るデータの配列を初期化しておく。 – どちらもデータの先頭アドレスとデータの長さを sg_io_hdr_t のメンバに設定する。 –SCSI コマンドでデータを受け取とったときの配列 の長さは CDB のデータとして返される。

sg_io_hdr_t で設定するデータ 2 ) SCSI コマンドで受け渡しするメモリ上の データ –dxfer_direction SCSI コマンドを使って遣取りをするデータの流れる方向 SG_DXFER_NONE データのやり取りをしない SG_DXFER_TO_DEV イニシエータ → ターゲット SG_DXVER_FROM_DEV ターゲット → イニシエータ SG_DXFER_TO_FROM_DEV ターゲット ←→ イニシエータ

sg_io_hdr_t で設定するデータ 2 ) SCSI コマンドで受け渡しするメモリ上の データ –SG_DXFER_TO_DEV mode select (6) mode select (10) log select set target port group send diagnostic set identifying information format unit reassign blocks persistent reserve out write long(10) write long(16) verify (10) write buffer

sg_io_hdr_t で設定するデータ 2 ) SCSI コマンドで受け渡しするメモリ上の データ –SG_DXFER_FROM_DEV inquiry read capacity (16) read capacity (10) mode sense (6) mode sense (10) request sense report luns log sense report target port group receive diagnostic results read defect (10) read media serial number report identifying information get configuration persistent reservation in read long (10) read long (16) read buffer

sg_io_hdr_t で設定するデータ 3 ) Sense Data –SCSI コマンドがエラーを起こしたときに 機器の」メモリに保存されたエラー情報 発生時に自動的に sg_io_hdr_t のメンバにコ ピーされる。 – 先頭アドレスとデータの長さは sg_io_hdr_t のメンバにあらかじめ設定しておく

ioctl の返り値 ステータス・バイトの値を返す。 値の定義は scsi.h の中で定義されている。