以下、本発明の好ましい実施例について、添付図面を参照して説明する。図1は、本発明のドライブ構成設定プログラムの第1実施例であるフィルタドライバを実行するPC30と、PC30との間でデータ送受信可能に接続されるマルチリーダ/ライタ1(マルチスロットタイプのメモリカードリーダ/ライタ)とを模式的に示す図である。図1に示すように、周辺装置としてのマルチリーダ/ライタ1は、第1外部メモリ(本実施例ではCF)21装着用の第1スロット11と、第2外部メモリ(本実施例ではSM)22装着用の第2スロット12と、第3外部メモリ(本実施例ではMS)23装着用の第3スロット13と、第4外部メモリ(本実施例ではSD)24装着用の第4スロット14とを備えている。
このように、マルチリーダ/ライタ1は、4種類の外部メモリ21,22,23,24を装着可能に4つのスロット11,12,13,14を備えるため、物理的には1台の装置でありながら、各々互いに異なる種類のメモリとの間でデータの読み込み又は書き込みを行う4つの論理ユニットとして機能する。なお、本明細書では、この論理ユニットを、実論理ユニットPUと称する。マルチリーダ/ライタ1では、これら4つの実論理ユニットPUの各々を識別するために、各々の実論理ユニットPUに、論理ユニット番号を付与する。本明細書では、実論理ユニットPUの各々に付与される論理ユニット番号を、実論理ユニット番号(P−LUN)と称する。
本実施例では、外部メモリ21との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN0が付与される。そして、外部メモリ22との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN1が付与される。そして、外部メモリ23との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN2が付与される。そして、外部メモリ24との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN3が付与される。
そして、PC30から、例えば、P−LUN0を記述したSCSIコマンド、すなわち実論理ユニット(P−LUN0)を指定したコマンドを送信することにより、その指定した実論理ユニット(P−LUN0)とPC30との間でデータ通信が可能となるように処理が実行される。このようにして、PC30からマルチリーダ/ライタ1の各スロット11,12,13,14に装着された各外部メモリ21,22,23,24にアクセス可能な情報処理システムが構築されている。
図2を参照して、情報処理装置としてのPC30について説明する。図2は、PC30の電気的構成を示すブロック図である。図2に示すように、CPU31、ROM32、RAM33、ハードディスクドライブ(HDD)34、フレキシブルディスクドライブ(FDD)35、CD−ROMドライブ36、キーボード37、マウス38、ディスプレイ39等を備え、これらがバス30aを介して相互に接続された一般的な構成となっている。さらに、USBI/F40を備え、このUSBI/F40及びUSBケーブル26を介してマルチリーダ/ライタ1に接続されている。
CPU31は、ROM32内の各種プログラム、HDD34にインストールされたOSや各種アプリケーションソフトなどに従って各種処理を実行するが、本実施形態では特に、HDD34にインストールされているOSにより、OSカーネル60(図6参照)としての機能とファイルシステム61(図6参照)としての機能が実現され、さらに、HDD34にインストールされているアプリケーションソフトであるフィルタドライバ62(図6参照)により図8にフローチャートで示す処理を実行するものである。
RAM33は、P−LUN最大値メモリ33aと、OS種類メモリ33bとを備えている。P−LUN最大値メモリ33aは、マルチリーダ/ライタ1から取得したP−LUN(実論理ユニット番号)の最大値(MAX−P−LUN)が格納されるメモリである。OS種類メモリ33bは、OSメモリ34aに格納されたOSが、上位OSであるか下位OSであるかを示す情報を格納するメモリである。ここで、上位OSとは、USB接続された1台の周辺装置(例えば、マルチリーダ/ライタ1)を複数の論理ユニットとして同時に認識し、各々の論理ユニットに独立にアクセスすることが可能なドライバソフトが標準でインストールされているOSのことをいう。一方、下位OSとは、USB接続された1台の周辺装置については1つの論理ユニットのみ認識可能なドライバソフトが標準でインストールされているOSである。
HDD34は、OSメモリ34aと、フィルタドライバメモリ34bと、LUNレイアウトツールメモリ34cと、レジストリ34dとを備えている。本第1実施例では、OSメモリ34aに上位OSが格納されているものとして説明する。なお、OSメモリ34aに下位OSが格納されている場合については、第2実施例において説明する。
フィルタドライバメモリ34bは、フィルタドライバ62(図5参照)が格納されるメモリである。ここで、本実施例のフィルタドライバ62は、OSの下層において動作するものであり、OSとマルチリーダ/ライタ1との間において送受信されるデータは、全てフィルタドライバ62を通過する。
LUNレイアウトツールメモリ34cは、LUNレイアウトツール64(図6参照)が格納されるメモリである。LUNレイアウトツール64は、マルチリーダ/ライタ1をどのようなドライブ(論理ユニット)構成で認識するかを示す「LUNレイアウト」を任意に設定するためのアプリケーションである。LUNレイアウトについては後述する。
レジストリ34dは、OSやアプリケーションの設定情報を一元管理するためのファイルである。レジストリ34dには、LUNレイアウトを管理するための情報であるLUNマップ63(図5参照)も記述される。なお、LUNマップ63については後述する。LUNレイアウトツール64により、LUNマップ63が変更されると、レジストリ34dに記述されたLUNマップ63も自動的に更新される。
図3は、マルチリーダ/ライタ1の電気的構成を示すブロック図である。図3に示すように、マルチリーダ/ライタ1は、その内部に、各構成部を制御するためのマイクロコンピュータ(以下「マイコン」という)2と、各スロット11,12,13,14にそれぞれ装着される各外部メモリ21,22,23,24に対するデータの入出力を制御するための入出力制御LSI6と、USB規格に基づくデータ通信の制御用コントローラであるUSBチップ8とを備え、これらがバス7を介して相互に接続されている。
マイコン2は、CPU3と、ROM4と、RAM5とを備えた一般的な構成となっており、CPU3は、ROM4に格納された各種プログラムや各種データに従って各種処理を行う。このROM4には、PC30からの各種コマンド(USBコマンドやSCSIコマンドなど)に対して応答するためのプログラムも格納されているが、これら各コマンドについては後述する。
第1スロット11、第2スロット12、第3スロット13、及び第4スロット14は、それぞれ、外部メモリ21,22,23,24が装着されると物理的にONとなるメモリ検出スイッチ(図示略)を備えており、メモリ検出スイッチがONとなると、その検出信号は、入出力制御LSI6を介してCPU3に割り込みを行う。従って、第1スロット11、第2スロット12、第3スロット13、第4スロット14に外部メモリ21,22,23,24が装着されると、CPU3はどのスロットに外部メモリが装着されたかを認識することができる。なお、本実施例のマルチリーダ/ライタ1は、PC30からUSBケーブル26を介して供給される電源(バスパワー)によって動作するよう構成されている。
USBケーブル26によりマルチリーダ/ライタ1が接続されると、PC30のOSがマルチリーダ/ライタ1を認識する。PC30にインストールされているOSが上位OSである場合、マルチリーダ/ライタ1の実論理ユニットPUを個別に認識することが可能であるので、従来のPC30であれば、例えば、マルチリーダ/ライタ1を、4つの論理ユニットとして認識していた。またPC30において、接続中の装置または論理ユニットをアイコンで一覧表示するドライブ構成画面(例えば、Windowsでは、「マイコンピュータ」の画面)では、例えば、接続された1台のマルチリーダ/ライタ1が、4つの論理ユニットとして表示されていた(図17参照)。しかしながら、このように、マルチリーダ/ライタ1における実論理ユニットPUの全てを個別に認識させることとすると、実論理ユニットPUの数と等しい数のドライブレターが必要となり、ドライブレターの確保が困難となる場合が生じる。また、ドライブ構成画面に数多くの論理ユニットが表示されると、その画面自体がユーザにとって煩わしいものとなるおそれがある。
よって、本実施例では、マルチリーダ/ライタ1を、実論理ユニットPUの数よりも少ない数の論理ユニットとして、ユーザに認識させることとした。PC30においてユーザに認識させる論理ユニットを、本明細書では、仮想論理ユニットVUと称する。また、各仮想論理ユニットVUには、互いを識別するための仮想論理ユニット番号(V−LUN)が付与される。
図4を参照して、PC30において設定される仮想論理ユニットVUについて説明する。図4(a)は、LUNレイアウト設定画面の一例を示す図である。LUNレイアウト設定画面は、仮想論理ユニットVUと実論理ユニットPUとの対応関係(以下、LUNレイアウトという)をユーザの操作に従って任意に設定するための画面である。
図4(a)に示すように、マルチリーダ/ライタ1の4つの実論理ユニット(P−LUN0,P−LUN1,P−LUN2,P−LUN3)は、仮想論理ユニットVUのいずれかに対応付けられる。本実施例では、4つの実論理ユニット(P−LUN0,P−LUN1,P−LUN2,P−LUN3)の全てが1つの仮想論理ユニット(V−LUN0)に対応付けられているものとして説明する。
図4(b)は、図4(a)に示すLUNレイアウトに従って表示されるドライブ構成画面の一例を示す図である。このドライブ構成画面は、PC30から、それぞれ独立にアクセス可能な装置または論理ユニットをアイコンで一覧表示する画面である。図4(a)を参照して説明したLUNレイアウトでは、1つの仮想論理ユニット(V−LUN0)に全ての実論理ユニット(P−LUN0,P−LUN1,P−LUN2,P−LUN3)が対応付けられていた。よって、ディスプレイ39にドライブ構成画面を表示させると、図4(b)に例示するように、マルチリーダ/ライタ1は、リムーバブルディスクを示す1つのアイコン(ドライブレターEが付されている)で表示される。このようにすれば、使用するドライブレターの数を節約することができると共に、マルチリーダ/ライタ1をユーザが認識しやすいように表示することができる。
図4(a)に戻り説明する。図4(a)に示すLUNレイアウト設定画面は、LUNレイアウトツール64を起動すると、PC30のディスプレイ39に表示される画面であり、現在設定されているLUNレイアウトが表示される。
図4(a)に示すように、LUNレイアウト設定画面は、仮想論理ユニットVUと、その仮想論理ユニットVUに対応付けられた実論理ユニットPUが表示されると共に、設定ボタン51、設定中止ボタン52、前詰め確認ボタン53、ヘルプボタン54を表示する構成である。
LUNレイアウト設定画面においてユーザは、例えばマウス38を操作して各実論理ユニットPUを示すアイコンをそれぞれドラッグ&ドロップすることにより、各実論理ユニットPUを各仮想論理ユニットVUのいずれかに自由に移動させることができる。従って、ユーザの所望するレイアウトを自由に設定することができる。
そして、ユーザが好みに応じて各アイコンの配置を行ったときに、ユーザが設定ボタン51をクリックすると、現在配置されているLUNレイアウトが確定される。但し、一つのアイコンも配置されていない枠が前方に存在した場合に設定ボタン51をクリックすると、自動的に各アイコンが前詰めされた状態に再配置された後、LUNレイアウトが確定される。設定ボタン51をクリックしてLUNレイアウトが確定すると、LUNレイアウトツール64は、後述するLUNマップ63を書き換えるのである。
一方、ユーザが設定中止ボタン52をクリックすると、どこまで設定準備が進んでいようとも、このLUNレイアウトツール64は強制的に終了される。また、LUNレイアウト設定画面において、一つのアイコンも配置されていない枠が前方(V−LUN番号が小さい側)に存在した場合、前詰め確認ボタン53をクリックすると、自動的に各アイコンが前詰めされ、前方に空白の枠が無くなる。なお、後方(LUN番号が大きい側)に空白の枠があること(例えば図4(a)の場合は仮想論理ユニット(V−LUN0)の枠の後方は全て空白である)については問題ない。また、ヘルプボタン54をクリックすると、このLUNレイアウトツール64の使用方法などが表示される。
LUNレイアウトツールを起動すると、LUNレイアウト設定画面にはまず現在設定されているレイアウトが表示されるため、ユーザは、既に設定されているレイアウトを確認した上で、必要に応じてそのレイアウト内容を変更することができ、しかもアイコンをドラッグ&ドロップするだけの簡単な操作によって視覚的に確認しながら設定を行うよう構成されているため、確実かつ効率的にLUNレイアウトの設定を行うことができる。
図5は、レジストリ34d(図2参照)に記述されるLUNマップ63を模式的に示す図である。図5に示すようにLUNマップ63は、V−LUNと、P−LUNとの対応関係とを記述する。また、LUNマップ63には、同一のV−LUNに対応付けられたP−LUN間の優先順位が併せて記述される。この優先順位は、LUNレイアウト設定画面における表示位置が高い順に付された順位である。
図5に示すLUNマップ63において、対応するP−LUNがない場合、そのV−LUNに対応するP−LUNの欄は空欄とされる。ここで、少なくとも1つのP−LUNが対応付けられているV−LUNのうち、最大値を仮想論理ユニット番号最大値(MAX−V−LUN)と称する。仮想論理ユニット番号最大値(MAX−V−LUN)は、LUNマップ63と共にレジストリ34d(図2参照)に記述される。なお、図5に示すLUNマップ63では、全てのP−LUNがV−LUN0に対応付けられているので、仮想論理ユニット番号最大値(MAX−V−LUN)は、「0」である。
図6を参照して、上述したPC30とマルチリーダ/ライタ1との間の各種データのやりとりについて説明する。図6は、PC30とマルチリーダ/ライタ1との間におけるデータ送受信を模式的に示す図である。図6に示すように、まず、OSカーネル60は、マルチリーダ/ライタ1の接続の有無を定期的にチェックする[1]。そして、USBケーブル26がPC30に装着されることでマルチリーダ/ライタ1とPC30が接続され、PC30からマルチリーダ/ライタ1へバスパワーが供給されると、マルチリーダ/ライタ1は電源ONとなってその動作を開始する[2]。
マルチリーダ/ライタ1は、動作開始時に、まず、初期化処理を実行する。この初期化処理は、マルチリーダ/ライタ1の起動時にROM4内のプログラムに従ってCPU3が実行するものであり、起動後、必要なパラメータを、実働作用のRAM5にコピーする。なお、マルチリーダ/ライタ1における初期化処理が終了するまでは準備中であるので、PC30からの定期チェックに対して応答しない。
そして、RAM5へのコピーが行われ、動作準備が完了すると、PC30からの定期チェックに対して準備OKである旨を返答する[3]。これを受けたPC30では、OSカーネル60がマルチリーダ/ライタ1に対してクラス取得を行い[4]、マルチリーダ/ライタ1は「ストレージクラス」である旨を返答する[5]。これにより、PC30は、マルチリーダ/ライタ1が大容量記憶装置デバイスであることを認識することになる。
次に、OSカーネル60がマルチリーダ/ライタ1に対して、ベンダー名、製品名、シリアル番号の取得を行い[6]、マルチリーダ/ライタ1は、ベンダー名と製品名とシリアル番号とを返答する[7]。
次に、OSカーネル60は、フィルタドライバ62をロードする[8]。フィルタドライバ62は、レジストリ34dからLUNマップ63(図5参照)、仮想論理ユニット番号最大値(MAX−V−LUN)等の必要なパラメータをリードする[9]。
そして、OSカーネル60は、マルチリーダ/ライタ1に対してUSBコマンド「GET_MAX_LUN」を発行し、マルチリーダ/ライタ1における論理ユニットの数を問い合わせる[10]。この「GET_MAX_LUN」コマンドは、OSが認識すべき論理ユニットの総数を尋ねるコマンドであり、換言すれば、PC30が備えるOSに、マルチ対応ドライバがインストールされている上位OSであることを示すコマンドである。
フィルタドライバ62は、このUSBコマンド「GET_MAX_LUN」を受信すると、GET_MAX_LUN受信処理を実行する。GET_MAX_LUN受信処理については、図8を参照して後に詳述するため、ここでは簡単に説明する。まず、USBコマンド「GET_MAX_LUN」を発行する[11]。マルチリーダ/ライタ1は、このUSBコマンド「GET_MAX_LUN」を受けると、GET_MAX_LUN応答処理を実行する。この処理は、USBコマンド「GET_MAX_LUN」の受信時にROM4内のプログラムに従ってCPU3が実行するものであり、受信後、P−LUNの最大値(MAX−P−LUN)を返答する[12]。ここでは、マルチリーダ/ライタ1においては、図1に示すようにP−LUNの最大値は「3」であるので、「3」を返答する。
フィルタドライバ62は、USBコマンド「GET_MAX_LUN」に対する返答を受け取ると、その受け取った値をP−LUN最大値メモリ33a(図2参照)に格納する。これにより、P−LUNが「0」から「3」までである(すなわち、実論理ユニットPUが4つある)ことを認識できるので、次に、各実論理ユニットPUを順番に指定して、SCSIコマンド「Inquiry」を発行し、その返答を受信する[13]。このSCSIコマンド「Inquiry」は、各実論理ユニット(ここではP−LUN0,P−LUN1,P−LUN2,P−LUN3)について、SCSIレベルでデバイスの種類を問い合わせるコマンドである。
マルチリーダ/ライタ1は、このSCSIコマンド「Inquiry」を受信すると、Inquiryコマンド応答処理を実行する。このInquiryコマンド応答処理は、Inquiryコマンドの受信時にROM4内のプログラムに従ってCPU3が実行するものであり、「ダイレクトアクセスデバイス」であること、「リムーバブル」であること、そして「製品名」及び「プロダクト名」など、デバイスの種類を示すデータを、各実論理ユニットPUについて返答する。
この返答を受けると、フィルタドライバ62は、受信したデータをRAM33に格納する。そして、レジストリ34dから読み込んだ仮想論理ユニット番号最大値(MAX−V−LUN)をOSカーネル60に返却する[14]。ここで、仮想論理ユニット番号最大値(MAX−V−LUN)として、「0」を返却したものとして説明する。
次に、OSカーネル60は、SCSIコマンド「Inquiry(V−LUN=0)」を発行する[15]。すなわち、OSカーネル60が認識する論理ユニット(仮想論理ユニット(V−LUN0))について、デバイスの種類を問い合わせる。これに対し、フィルタドライバ62はInquiry情報を返却する[16]。
本実施例では、フィルタドライバ62は、フィルタドライバ62自身のベンダーIDとプロダクト名、マルチリーダ/ライタ1から受信したP−LUN最大値(MAX−P−LUN)、およびOSが上位OSであることなどを記述したInquiry情報を返却する。なお、本実施例において、フィルタドライバ62からOSに返却されるInquiry情報は、常に同一の情報である。
次に、OSカーネル60はファイルシステム61に対してドライブレターを確定する[17]。これにより仮想論理ユニット(V−LUN0)についてのドライブレターが割り当てられる。ここでは、全ての実論理ユニットPUが1つの仮想論理ユニット(V−LUN0)に対応付けられている。よって、マルチリーダ/ライタ1は、ドライブレターEが付された1つの論理ユニットとして、ドライブ構成画面(図4(b)参照)に表示され、ユーザに認識されることとなる。
次に、ドライブレターが割り当てられた仮想論理ユニット(V−LUN0)を指定したSCSIコマンドがファイルシステム61から発行される[18]。ここでは、ファイルシステム61からSCSIコマンド「Read/Write(V−LUN=0)」が発行されたものとして説明する。
フィルタドライバ62は、ファイルシステム61からのSCSIコマンド「Read/Write(V−LUN=0)」を受信すると、LUNマップ63においてV−LUN0に対応するP−LUNのそれぞれについて、SCSIコマンド「TestUnitReady」を順番に発行する。このSCSIコマンド「TestUnitReady」の発行の順序は、LUNマップ63において、各P−LUNに付された優先順位に従う。そして、このコマンド「TestUnitReady」に対し、「Ready」との応答が得られるまで、V−LUN0に対応するP−LUNに順番に発行される。
図4(b)にて図示したように、LUNマップ63において、V−LUN0に対応付けられたP−LUNは、「0」,「1」,「2」,「3」であり、優先順位もこの順番であるから、まずSCSIコマンド「TestUnitReady(P−LUN=0)」をマルチリーダ/ライタ1に発行する[19]。このSCSコマンド「TestUnitReady(P−LUN=0)」は、実論理ユニット(P−LUN0)に対応するメモリ(本実施例では、第1外部メモリ(CF)21)がスロット11に装着中であるか否かを問い合わせるコマンドである。マルチリーダ/ライタ1は、第1外部メモリ21がスロット11に装着中である場合は、その旨を示すコマンド「Ready」を返答するが、ここでは、第1外部メモリ21がスロット11に装着中でなく、その旨を示すコマンド「Not Ready」を返答したものとして説明する[20]。
次に、フィルタドライバ62は、SCSIコマンド「TestUnitReady(P−LUN=1)」をマルチリーダ/ライタ1に発行する[21]。これにより、実論理ユニット(P−LUN1)に対応付けられたメモリ(本実施例では、第2外部メモリ(SM)22)がスロット12に装着中であるか否かを問い合わせる。ここでは、第2外部メモリ22がスロット12に装着中でなく、その旨を示すコマンド「Not Ready」を返答したものとして説明する[22]。
次に、フィルタドライバ62は、SCSIコマンド「TestUnitReady(P−LUN=2)」をマルチリーダ/ライタ1に発行する[23]。これにより、実論理ユニット(P−LUN2)に対応付けられたメモリ(本実施例では、第3外部メモリ(MS)23)がスロット13に装着中であるか否かを問い合わせる。ここでは、第3外部メモリ23がスロット13に装着中でなく、その旨を示すコマンド「Not Ready」を返答したものとして説明する[24]。
次に、フィルタドライバ62は、SCSIコマンド「TestUnitReady(P−LUN=3)」をマルチリーダ/ライタ1に発行する[25]。これにより、実論理ユニット(P−LUN3)に対応付けられたメモリ(本実施例では、第4外部メモリ(SD)24)がスロット14に装着中であるか否かを問い合わせる。ここでは、第4外部メモリ24がスロット14に装着中であるものとして、その旨を示すコマンド「Ready」を返答したものとして説明する[26]。これにより、仮想論理ユニット(V−LUN0)に対応する実論理ユニットPUのうち、仮想論理ユニット(V−LUN0)の指定によりアクセス可能な実論理ユニットPUとして、実論理ユニット(P−LUN3)を決定し、登録することができる。
なお、優先順位の高い実論理ユニットPUから順に問い合わせると共に、「Ready」の返答がいずれかの実論理ユニットPUについて得られた場合、そこで問い合わせを終了するので、スロットに装着中の外部メモリが2以上あった場合であっても、LUNマップ63(図5参照)において最も高い優先順位が付されている実論理ユニットPUが、アクセス可能な実論理ユニットPUとして登録される。
その後、ファイルシステム61から、データが出力された場合[27]、その出力データはフィルタドライバ62により読み捨てられ、マルチリーダ/ライタ1には送信されない。また、フィルタドライバ62からファイルシステム61へは、データ通信がNGである旨を示すステータスが発行される[28]。このステータスを受信すると、ファイルシステム61は、センスデータを要求するSCSIコマンド「RequestSense」を発行する[28a]。これに応じて、フィルタドライバ62により、メモリ交換発生を示すセンスデータが発行される[28b]。
メモリ交換発生を示すセンスデータを受信したファイルシステム61では、前回使用されたメモリ管理情報を破棄する。また、ファイルシステム61は、再度、SCSIコマンド「Read/Write(V−LUN=0)」を発行する[29]。今度は、仮想論理ユニット(V−LUN0)に対応するアクセス可能実論理ユニットとして、実論理ユニット(P−LUN3)が登録済みである。
よって、SCSIコマンド「Read/Write(V−LUN=0)」を受信したフィルタドライバ62は、受信したSCSIコマンドを、SCSIコマンド「Read/Write(P−LUN3)」に変更する。すなわち、アクセス可能な実論理ユニットPUとして登録された実論理ユニット(P−LUN3)を指定するコマンドに変更し、マルチリーダ/ライタ1に発行する[30]。
これにより、ファイルシステム61とマルチリーダ/ライタ1との間でデータの読み書きが行えるようになる。具体的には、ファイルシステム61からのSCSIコマンド「Read/Write」に対してマルチリーダ/ライタ1がデータ及びステータスを送信する、というやりとりになる[31],[32]。
次に、このような処理を繰り返すうちに、実論理ユニット(P−LUN3)に対応付けられたメモリ(ここでは、第4外部メモリ24)がスロット14から取り外された場合について説明する。
ファイルシステム61からSCSIコマンド「Read/Write(V−LUN=0)」が発行されると[33]、上述したように、そのSCSIコマンドは、フィルタドライバ62により、SCSIコマンド「Read/Write(P−LUN3)」に変更して発行される[34]。
しかし、実論理ユニット(P−LUN3)に対応付けられたメモリ24はスロット14から取り外されると、マルチリーダ/ライタ1は、データ通信がNGであった旨を示すステータス、およびスロット内にメモリが無い旨を示すステータスを発行する[35]。このステータスを受信するとフィルタドライバ62により、仮想論理ユニット(V−LUN0)のアクセス可能論理ユニットとして登録されていた実論理ユニット(P−LUN3)の登録が解除される。すなわち、仮想論理ユニット(V−LUN0)を再び未登録状態に戻す。
また、フィルタドライバ62からファイルシステム61へは、データ通信がNGである旨を示すステータスが発行される[36]。このステータスを受信すると、ファイルシステム61は、センスデータを要求するコマンド「RequestSense」を発行する[36a]。これに応じて、フィルタドライバ62により、メモリ無しを示すセンスデータが発行される[36b]。
よって、次回以降にSCSIコマンド「Read/Write(V−LUN=0)」が発行されたときには、仮想論理ユニット(V−LUN0)の指定によりアクセス可能な実論理ユニットPUは未登録の状態であるから、[19]に戻り、アクセス可能な実論理ユニットPUを決定する。これにより、仮想論理ユニット(V−LUN0)に対応付けられた実論理ユニットPUのうち、次に新たに装着された外部メモリに対応する実論理ユニットPUが、新たなアクセス可能実論理ユニットとして登録される。
図7を参照して、ユーザにより、LUNレイアウトの変更操作が行われる場合について説明する。図7は、ユーザによりLUNレイアウトツール64が起動された場合における、PC30とマルチリーダ/ライタ1との間のデータ送受信を模式的に示す図である。
まず、LUNレイアウトツール64は起動後、まず、SCSIコマンド「Inquiry」を発行する[40]。フィルタドライバ62は、図6における[16]の処理において説明したものと同一のInquiry情報をLUNレイアウトツール64に返却する[41]。
次に、LUNレイアウトツール64は、LUNマップ63(図5参照)を読み込む[42]。そして、読み込んだLUNマップ63に従って、LUNレイアウト設定画面(図4(a)参照)をPC30のディスプレイ39に表示し、現在設定されているLUNレイアウトをユーザに対し示す。
そして、図4(a)を参照して説明したレイアウト作業がユーザにより行われ、ユーザが好みに応じて各アイコンの配置を行い、LUNレイアウトが確定すると[43]、LUNレイアウトツール64は、LUNマップ63を書き換え[44]、処理を終了する。
LUNレイアウトツール64によりLUNレイアウトを変更したユーザは、取扱説明書やディスプレイ39における表示に従って、USBケーブル26を抜くか、またはマルチリーダ/ライタ1の電源をオフする[45]。
よって、その後、OSカーネル60から定期チェックが送信された場合[46]、マルチリーダ/ライタ1は応答しない[47]。これに基づいて、PC30において、マルチリーダ/ライタ1のUSBケーブル26が抜かれたことを検出することができるので、OSカーネル60は、フィルタドライバ62をアンロードする[48]。
そして、その後、USBケーブル26によりPC30とマルチリーダ/ライタ1とが接続され、マルチリーダ/ライタ1に電源が供給されて電源オンとなると[2]、図6を参照して説明した[1]から[9]の処理が繰り返される。ここで、LUNマップ63からLUNマップ63から必要なパラメータをリードする[9]が、これは変更後のLUNマップ63から読み込まれるパラメータであるため、以降の処理は、変更後のLUNマップ63に基づいて行われる。
図8を参照して、GET_MAX_LUN受信処理について説明する。図8は、GET_MAX_LUN受信処理を示すフローチャートである。このGET_MAX_LUN受信処理は、USBコマンド「GET_MAX_LUN」がOSカーネル60により発行されると開始する処理であり、図6に示す[10]から[14]に対応する処理である。
まず、USBコマンド「GET_MAX_LUN」が発行されると、OSメモリ34aに格納されたOSが上位OSで有ることがOS種類メモリ33bに記憶されているか否かを判断する(S2)。未だ記憶されていない場合(S2:No)、OSメモリ34aに格納されたOSが上位OSで有ることをOS種類メモリ33bに格納する(S4)。上述したように、OSによりUSBコマンド「GET_MAX_LUN」が発行される場合、そのOSは上位OSだからである。
次に、マルチリーダ/ライタ1に対し、USBコマンド「GET_MAX_LUN」を発行し、そのUSBコマンド「GET_MAX_LUN」に応じて、マルチリーダ/ライタ1から返答されるP−LUNの最大値(MAX−P−LUN)を、P−LUN最大値メモリ33aに記憶する(S6)。そして、変数「P−LUN」を「0」とする(S8)。
次に、変数「P−LUN」で示される現P−LUNを記述したSCSIコマンド「Inquiry」を発行し、その返答としてマルチリーダ/ライタ1から返却されるInquiry情報を取得し、RAM33に記憶する(S10)。最初は、変数「P−LUN」が「0」であるから、実論理ユニット(P−LUN0)についてのInquiry情報がRAM33に格納される。
次に、変数「P−LUN」に「1」を加算する(S12)。そして、変数「P−LUN」の値が、MAX−P−LUN(P−LUNの最大値)以下であるか否かを判断する(S14)。
変数「P−LUN」の値がMAX−P−LUN以下である間は(S14:Yes)、S10に戻り処理を繰り返す。そして処理を繰り返すうちに、変数「P−LUN」の値がMAX−P−LUNより大となると(S14:No)、全ての実論理ユニットPUについて、Inquiry情報を取得したこととなるので、次に、レジストリ34dから読み込んだMAX−V−LUNをOSカーネル60に返す(S16)。これにより、OSカーネル60から見ると、USBコマンド「GET_MAX_LUN」(接続した装置の論理ユニット数を問い合わせるコマンド)の返答として、MAX−V−LUN(すなわち、仮想論理ユニット番号V−LUNの最大値)を受けることとなる。
なお、OSメモリ34aに格納されたOSが上位OSであることがOS種類メモリ33bに既に記憶されている場合(S2:Yes)、S4からS14の処理をスキップし、LUNマップ63内のMAX−V−LUNを返す(S16)。
以上説明したように、第1実施例のフィルタドライバ62により、PC30において、マルチリーダ/ライタ1の実論理ユニットPUの数よりも少ない数に設定された仮想論理ユニットVUに、マルチリーダ/ライタ1の実論理ユニットPUを対応付けるので、ユーザが認識する論理ユニット数を少なくすることができ、ドライブ構成画面における表示を単純明快にできると共に、使用するドライブレター数を節約することができる。また、同一の仮想論理ユニットVUに複数の実論理ユニットPUが対応付けられていても、その実論理ユニットPUのうち、実際にスロットに装着中の外部メモリが存在する実論理ユニットPUが、アクセス可能論理ユニットとして決定され、そのアクセス可能論理ユニットに対応付けられた外部メモリにアクセスできる。また、途中で外部メモリの入れ替えが行われた場合には、実際に外部メモリが装着中の実論理ユニットPUが自動的に検出され、アクセス可能論理ユニットとして登録されるので、使用する実論理ユニットPUの切換のために、PC30を再起動したり、USBケーブル26を一旦抜くなどの面倒な作業をしなくてもよい。
また、仮想論理ユニットVUに対し実論理ユニットPUを対応付けるための処理がフィルタドライバ62により実行されるので、マルチリーダ/ライタ1側の変更が不要である。よって、ユーザから見ると、PC30にフィルタドライバ62をインストールするだけでよく、手持ちのマルチリーダ/ライタ1をそのまま使用することができる。
さらに、LUNレイアウトツール64により、各仮想論理ユニットVU対する各実論理ユニットPUの対応付けをユーザの好みに応じて自由に設定できる。そのため、例えば使用頻度の低いメモリを一つのドライブ(仮想論理ユニットVU)にまとめてドライブレターを節約することによりドライブ構成画面の表示をすっきりさせたり、頻繁に使う実論理ユニットPUについては独立して一つのドライブレターを割り当てるようにするといったことが可能となり、ユーザの使い勝手の良好な情報処理システムの提供が可能となる。
次に、図9を参照して、フィルタドライバ62によりPC30において実行される処理の第2実施例について説明する。上記した第1実施例では、OSメモリ34aに格納されたOSが、上位OSであったが、第2実施例では、PC30のOSメモリ34aに下位OSが格納されているものとして説明する。なお、この第2実施例において、上記した第1実施例と同一の部分には同一の符号を付して、その説明を省略する。
図9は、第2実施例におけるPC30とマルチリーダ/ライタ1との間の各種データのやりとりを示す図である。上述したように、第2実施例では、PC30のOSメモリ34aに下位OSが格納されているため、OSカーネル65の動作は、第1実施例のOSカーネル61とは異なる。なお、図9に示すデータの送受信のうち、図6を参照して説明したデータ送受信と同一のものについては、同一の番号を付して説明を省略する。
OSメモリ34aに下位OSが格納されている場合、OSカーネル65は、SCSIコマンド「Inquiry(V−LUN=0)」を発行する[60]。すなわち、上記第1実施例では、OSメモリ34aに上位OSが格納されていたため、1の周辺装置について複数の論理ユニットを取り扱うこと可能であった。そのためOSカーネル60(図6参照)からは、設定された論理ユニットの総数(ここでは、論理ユニット番号の最大値)を問い合わせるためのUSBコマンド「GET_MAX_LUN」が発行されていた。これに対し、第2実施例において、OSメモリ34aに格納されている下位OSに標準でインストールされているドライバソフトは、1の周辺装置は、1の論理ユニットとして取り扱うため、論理ユニットの総数を問い合わせることなく、デバイスの種類を問い合わせるSCSIコマンド「Inquiry(V−LUN=0)」を発行するのである。
フィルタドライバ62は、このSCSIコマンド「Inquiry(V−LUN=0)」を受信すると、Inquiry受信処理を実行する。Inquiry受信処理については、図10を参照して後に詳述するため、ここでは簡単に説明する。まず、USBコマンド「GET_MAX_LUN」を発行する[61」。マルチリーダ/ライタ1は、このUSBコマンド「GET_MAX_LUN」を受けると、P−LUNの最大値(MAX−P−LUN)を返答する[62]。
フィルタドライバ62は、USBコマンド「GET_MAX_LUN」に対する返答を受け取ると、その受け取った値をP−LUN最大値メモリ33a(図2参照)に格納する。そして、マルチリーダ/ライタ1に対し、SCSIコマンド「Inquiry」を発行し、その返答を受信する[63]。
この返答を受けると、フィルタドライバ62は、P−LUN毎に受信したデータをRAM33に格納する。そして、フィルタドライバ62は、Inquiry情報を返却する[64]。本実施例では、フィルタドライバ62は、フィルタドライバ62自身のベンダーIDとプロダクト名、マルチリーダ/ライタ1から受信したP−LUN最大値(MAX−P−LUN)、およびOSが下位OSであることなどを記述したInquiry情報を返却する。なお、本実施例において、フィルタドライバ62からOSに返却されるInquiry情報は、常に同一の情報である。
次に、OSカーネル65はファイルシステム61に対してドライブレターを確定する[17]。本実施例では、マルチリーダ/ライタ1に対応したドライブレターとして「E」が割り当てられる。
次に、第2実施例におけるLUNレイアウトの変更操作について説明する。上述した第1実施例は、上位OSがインストールされている場合であったため、複数の仮想論理ユニットVUを設定可能であり、且つ仮想論理ユニットVUと実論理ユニットPUとの対応関係をLUNレイアウトツール64により任意に変更可能であった。これに対し、第2実施例は、下位OSがインストールされている場合についてであるため、1つの仮想論理ユニットVUのみしか設定できず、全ての実論理ユニットPUは、1つの仮想論理ユニット(V−LUN0)に対応付けられる。よって、第2実施例におけるLUNレイアウトの変更では、仮想論理ユニット(V−LUN0)内における各実論理ユニットPU優先順位を変更することのみが可能である。
LUNレイアウトツール64は起動後、まず、SCSIコマンド「Inquiry」を発行する[40]。フィルタドライバ62は、仮想論理ユニット(V−LUN0)のInquiry情報をLUNレイアウトツール64に返却する[41]。
次に、LUNレイアウトツール64は、LUNマップ63(図5参照)を読み込む[42]。そして、読み込んだLUNマップ63に従って、LUNレイアウト設定画面(図4(a)参照)をPC30のディスプレイ39に表示し、現在設定されているLUNレイアウトをユーザに対し示す。
そして、図4(a)を参照して説明したレイアウト作業がユーザにより行われ、ユーザが好みに応じて各アイコンの配置を行うレイアウト作業をする[43]。なお、ここで、LUNレイアウトツール64は、下位OSであることを示すInquiry情報に基づいて、仮想論理ユニット(V−LUN0)以外の仮想論理ユニットVUに対し、実論理ユニットPUを対応付ける操作を無効とする。そして、LUNレイアウトが確定すると、LUNレイアウトツール64は、LUNマップ63を書き換え[44]、処理を終了する。
図10を参照して、Inquiry受信処理について説明する。図10は、Inquiry受信処理を示すフローチャートである。このInquiry受信処理は、SCSIコマンド「Inquiry」がOSカーネル65により発行されると開始する処理である。
まず、SCSIコマンド「Inquiry」が発行されると、OSメモリ34aに格納されたOSが下位OSで有ることがOS種類メモリ33bに記憶されているか否かを判断する(S22)。未だ記憶されていない場合(S22:No)、OSメモリ34aに格納されたOSが下位OSで有ることをOS種類メモリ33bに格納する(S24)。上述したように、最初にUSBコマンド「GET_MAX_LUN」が発行されることなく、Inquiryコマンドが発行される場合、そのOSは下位OSだからである。
次に、マルチリーダ/ライタ1に対し、USBコマンド「GET_MAX_LUN」を発行し、そのUSBコマンド「GET_MAX_LUN」に応じて、マルチリーダ/ライタ1から返答されるP−LUNの最大値(MAX−P−LUN)を、P−LUN最大値メモリ33aに記憶する(S26)。そして、変数「P−LUN」を「0」とする(S28)。
次に、変数「P−LUN」で示される現P−LUNを記述したSCSIコマンド「Inquiry」を発行し、その返答としてマルチリーダ/ライタ1から返却されるInquiry情報を取得し、RAM33に記憶する(S30)。最初は、変数「P−LUN」が「0」であるから、実論理ユニット(P−LUN0)についてのInquiry情報がRAM33に格納される。
次に、変数「P−LUN」に「1」を加算する(S32)。そして、変数「P−LUN」の値が、MAX−P−LUN(P−LUNの最大値)以下であるか否かを判断する(S34)。
変数「P−LUN」の値がMAX−P−LUN以下である間は(S34:Yes)、S10に戻り処理を繰り返す。そして、変数「P−LUN」の値がMAX−P−LUNより大となると(S34:No)、全ての実論理ユニットについて、Inquiry情報を取得したこととなるので、次に、Inquiry情報をOSカーネル65に返す(S36)。これにより、OSカーネル60から見ると、SCSIコマンド「Inquiry」の返答として、Inquiry情報を受けることとなる。
一方、OSメモリ34aに格納されたOSが下位OSであることがOS種類メモリ33bに既に記憶されている場合(S32:Yes)、S24からS34の処理をスキップし、Inquiry情報を返す(S36)。
以上説明したように、第2実施例によれば、1つの仮想論理ユニットVUに複数の実論理ユニットPUが対応付けられるが、その実論理ユニットPUのうち、実際にスロットに装着中の外部メモリが存在する実論理ユニットPUが、アクセス可能論理ユニットとして決定され、そのアクセス可能論理ユニットとの間でデータ通信が可能となる。また、途中で外部メモリの入れ替えが行われた場合には、実際に外部メモリが装着中の実論理ユニットPUが自動的に検出され、アクセス可能論理ユニットとして登録されるので、PCにインストールされているOSが下位OSであっても、異なる実論理ユニットPUを認識させるために、PC30を再起動したり、USBケーブル26をPC30側の端子から一旦抜き取り再度挿入するなどの面倒な作業が不要である。
次に、図11を参照して、第3実施例のフィルタドライバ66について説明する。上記した第1実施例および第2実施例では、PC30に接続されたマルチリーダ/ライタ1が内蔵メモリを備えないものであった。これに対し、第3実施例は、PC30に接続されたマルチリーダ/ライタ100が、外部メモリ21,22,23を脱着可能な第1スロット11、第2スロット12、第3スロット13を備えると共に、脱着不可能な内蔵フラッシュメモリ15を備えている点が、上述した第1実施例および第2実施例と異なる。なお、この第3実施例において、上記した第1実施例と同一の部分には同一の符号を付して、その説明を省略する。
図11は、第3実施例において用いられるマルチリーダ/ライタ100の電気的構成を示すブロック図である。図11に示すように、マルチリーダ/ライタ100は、PC30からのファイル操作によってデータの読み書きが可能な内蔵フラッシュメモリ15を備え、この内蔵フラッシュメモリ15はバス7に接続されている。
すなわち、第3実施例において用いられるマルチリーダ/ライタ100は、PC30からアクセス可能なメモリとして、外部メモリ21,22,23に加えて、内蔵フラッシュメモリ15の合計4種類を備えているので、合計で、4つの実論理ユニットPUとして機能可能である。そして、マルチリーダ/ライタ100をUSBケーブル26にてPC30と接続することにより、PC30からマルチリーダ/ライタ100の各外部メモリ21,22,23及び内蔵フラッシュメモリ15にアクセス可能な情報処理システムが構築される。
なお、PC30のフィルタドライバメモリ34bには、第1実施例および第2実施例において説明したフィルタドライバ62に替えて、フィルタドライバ66(図13参照)がインストールされている。このフィルタドライバ66は、第1実施例および第2実施例において説明したフィルタドライバ62と同様に、OSの下層において動作するものであり、OSとマルチリーダ/ライタ100との間において送受信されるデータを制御するためのものであるが、内蔵フラッシュメモリ15を備えたマルチリーダ/ライタ100用のフィルタドライバ66である点において、第1実施例および第2実施例のフィルタドライバ66と異なる。
図12は、マルチリーダ/ライタ100とPC30とを模式的に示した図である。図12に示すように、マルチリーダ/ライタ1は、3種類の外部メモリ21,22,23を挿入可能なスロット11,12,13と内蔵フラッシュメモリ15とを備えているから、マルチリーダ/ライタ100は、物理的には1台の装置でありながら、互いに異なる種類のメモリにアクセス可能な4つの実論理ユニットPUとして機能する。
図12に示すように、本実施例では、内蔵フラッシュメモリ15との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN0が付与される。また、外部メモリ21との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN1が付与される。そして、外部メモリ22との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN2が付与される。そして、外部メモリ23との間でデータの書き込みまたは読み込みを行う実論理ユニットPUにはP−LUN3が付与される。
そして、PC30から例えば、P−LUN0が記述されたコマンドを受信すると、P−LUN0で指定される実論理ユニットPUとPC30との間でデータ通信が実行される。このようにして、PC30からマルチリーダ/ライタ100の内蔵フラッシュメモリ15または各スロット11,12,13に装着された各外部メモリ21,22,23にアクセス可能な情報処理システムが構築されている。
図13を参照して、上述したPC30とマルチリーダ/ライタ100との間の各種データのやりとりについて説明する。図13は、PC30とマルチリーダ/ライタ100との間におけるデータ送受信を模式的に示す図である。なお、ドライブレター決定までの処理は、図6を参照して説明した第1実施例と同様であるため説明を省略し、ここでは、ドライブレター決定後におけるデータの送受信について説明する。また、仮想論理ユニットVUと実論理ユニットPUとの対応関係については、第1実施例と同様に、全ての実論理ユニットPUが仮想論理ユニットVUに対応付けられているものとして説明する。
まず、仮想論理ユニット(V−LUN0)を指定したSCSIコマンド「Read/Write(V−LUN=0)」が、ファイルシステム61から発行される[70]。ここでは、V−LUN0に対応するアクセス可能な実論理ユニットPUが未登録であるものとして説明する。
フィルタドライバ66は、アクセス可能な実論理ユニットPUが未登録である場合、LUNマップ63(図5参照)において、そのSCSIコマンドに記述されたV−LUN(ここでは0)に対応付けられたP−LUNを取得し、そのP−LUNについて、SCSIコマンド「TestUnitReady」を順番に発行する。ここでは、V−LUN0には、P−LUN0、P−LUN1、P−LUN2、P−LUN3、P−LUN4が対応付けられているものとして説明する。
SCSIコマンド「TestUnitReady」を各実論理ユニット(P−LUN0,P−LUN1,P−LUN2,P−LUN3)について発行する場合、上述した第1実施例では、フィルタドライバ66は、LUNマップ63における優先順位に従って、SCSIコマンド「TestUnitReady」を順番に発行していた(図6[13]参照)。
これに対し、本実施例では、基本的には、LUNマップ63における優先順位に従って、SCSIコマンド「TestUnitReady」を発行するが、内蔵フラッシュメモリ15が割り当てられた実論理ユニット(P−LUN0)については、最後にSCSIコマンド「TestUnitReady」を発行する点が第1実施例と異なる。すなわち、外部メモリ21,22,23が割り当てられた実論理ユニット(P−LUN1,P−LUN2,P−LUN3)について優先的に上記コマンドを発行することにより、外部メモリ21,22,23が装着されていればその実論理ユニットPUを優先的に検出する。
まず「TestUnitReady(P−LUN=1)」をマルチリーダ/ライタ100に発行する[71]。マルチリーダ/ライタ100は、第1外部メモリ21がスロットに装着中である場合は、その旨を示すコマンド「Ready」を返答するが、ここでは、第1外部メモリ21がスロットに装着中でないものとして、その旨を示すコマンド「Not Ready」を返答したものとして説明する[72]。
次に、フィルタドライバ66は、SCSIコマンド「TestUnitReady(P−LUN=2)」をマルチリーダ/ライタ100に発行する[73]。ここでは、第2外部メモリ22がスロットに挿入中でないものとして、その旨を示すコマンド「Not Ready」を返答したものとして説明する[74]。
次に、フィルタドライバ66は、SCSIコマンド「TestUnitReady(P−LUN=3)」をマルチリーダ/ライタ1に発行する[75]。ここでは、第3外部メモリ23がスロットに挿入中でないものとして、その旨を示すコマンド「Not Ready」を返答したものとして説明する[76]。
このように、内蔵フラッシュメモリ15が対応付けられた実論理ユニット(P−LUN0)以外の実論理ユニットについてSCSIコマンド「TestUnitReady」を発行し、そのいずれもが「Not Ready」を返答した場合、最後に、内蔵フラッシュメモリ15が対応付けられた実論理ユニット(P−LUN0)について、SCSIコマンド「TestUnitReady」を発行する[77]。内蔵フラッシュメモリ15は、常に装着中であるので、「Ready」が返答される[78]。
その後、SCSIコマンド「Read/Write(V−LUN=0)」に続いて、ファイルシステム61から、データが出力された場合であっても[79]、その出力データはフィルタドライバ66により読み捨てられ、マルチリーダ/ライタ100には送信されない。また、フィルタドライバ66からファイルシステム61へは、ファイルシステム61からマルチリーダ/ライタ100へのデータの出力がNGである旨を示すステータスが発行される[80]。このステータスが発行されると、ファイルシステム61によりSCSIコマンド「RequestSense」が発行される[80a]。このSCSIコマンド「RequestSense」が発行されると、フィルタドライバ66は、メモリ交換発生を示すセンスデータを転送する[80b]。
このメモリ交換発生を示すセンスデータを受信したファイルシステム61では、前回使用されたメモリ管理情報を破棄する。そして、ファイルシステム61は、再度、SCSIコマンド「Read/Write(V−LUN=0)」を発行する[81]。なお、今度は、仮想論理ユニット(V−LUN0)に対応するアクセス可能実論理ユニットとして、実論理ユニット(P−LUN0)が登録済みである。
よって、SCSIコマンド「Read/Write(V−LUN=0)」を受信したフィルタドライバ66は、受信したSCSIコマンドを、SCSIコマンド「Read/Write(P−LUN0)」に変更する。すなわち、実論理ユニット(P−LUN0)を指定するコマンドに変更し、マルチリーダ/ライタ100に発行する[82]。
これにより、ファイルシステム61とマルチリーダ/ライタ100との間でデータの読み書きが行えるようになる。具体的には、ファイルシステム61からのSCSIコマンド「Read/Write」に対してマルチリーダ/ライタ1がデータ及びステータスを送信する、というやりとりになる[83],[84]。すなわち、スロットのいずれかに、外部メモリ21,22,23が装着されている間は、仮想論理ユニット(V−LUN0)の指定により、その外部メモリ21,22,23にアクセスできる一方、いずれの外部メモリ21,22,23も装着されていない場合には、仮想論理ユニット(V−LUN0)の指定により、内蔵フラッシュメモリ15にアクセスすることができる。
次に、仮想論理ユニットに対応するアクセス可能実論理ユニットとして、内蔵フラッシュメモリ15に対応する実論理ユニット(P−LUN0)が登録されている間における処理について説明する。
まず、フィルタドライバ66は、ファイルシステム61からSCSIコマンド「Read/Write(V−LUN=0)」が発行されると[85]、まず、仮想論理ユニット(V−LUN0)のアクセス可能実論理ユニットPUとして登録されているのが、内蔵フラッシュメモリ15に対応する実論理ユニット(P−LUN0)であることを確認する。そして、OSによる前回のSCSIコマンド(さらに詳細には、「TestUnitReady」以外のSCSIコマンド)の発行から所定期間(本実施例では20秒)以上経過しているか否かを判断し、20秒以上経過している場合には、LUNマップ63(図5参照)において、V−LUN0に対応付けられたP−LUNのうち、現在登録中の実論理ユニット(P−LUN0)以外のP−LUNを指定して、順番に、SCSIコマンド「TestUnitReady」を発行し、その返答を受け取る[86]。この処理を定期的に実行することにより、スロットに外部メモリ21,22,23のいずれかが新たに装着されたか否かを検出することができる。
ここでは、まず、スロット11,12,13のいずれにも新たな外部メモリ21,22,23が装着されなかったものとして説明する。その場合、発行したSCSIコマンド「TestUnitReady」に対する返答は、全て「Not Ready」であるので、ファイルシステム61から受信したSCSIコマンド「Read/Write(V−LUN=0)」を、SCSIコマンド「Read/Write(P−LUN0)」に変更する。すなわち、実論理ユニット(P−LUN0)を指定するコマンドに変更し、マルチリーダ/ライタ1に発行する[87]。
これにより、ファイルシステム61とマルチリーダ/ライタ100の実論理ユニット(P−LUN0)との間でデータの読み書きが引き続き行なわれる。[88],[89]。
次に、内蔵フラッシュメモリ15が対応付けられた実論理ユニット(P−LUN0)がアクセス可能な実論理ユニットPUとして登録されている間に、スロット11,12,13のいずれかに新たな外部メモリ21,22,23が装着された場合について説明する。まず、フィルタドライバ66は、ファイルシステム61からSCSIコマンド「Read/Write(V−LUN=0)」が発行され[90]、前回のSCSIコマンドの発行から20秒以上経過している場合には、上述したように、V−LUN0に対応付けられたP−LUNのうち、現在登録中の実論理ユニット(P−LUN0)以外の実論理ユニットPUを指定して、順番に、SCSIコマンド「TestUnitReady」を発行し、その返答を受け取る[91]。ここでは、実論理ユニットP−LUN2について「Ready」の返答が得られたものとして説明する。
実論理ユニットP−LUN2について「Ready」の返答が得られた場合、すなわち、実論理ユニット(P−LUN2)に対応付けられたメモリ(本実施例では、第2外部メモリ(SM)22)が新たにスロット12に挿入された場合、仮想論理ユニット(V−LUN0)に対応する実論理ユニットPUとして、内蔵フラッシュメモリ15に対応付けられた実論理ユニット(P−LUN0)をアクセス可能な実論理ユニットとしての登録から解除する。
次に、SCSIコマンド「Read/Write(V−LUN=0)」に続いて、ファイルシステム61から、データが出力された場合であっても[94]、アクセス可能な実論理ユニットが未登録であるため、その出力データはフィルタドライバ66により読み捨てられ、マルチリーダ/ライタ1には送信されない。
そして、フィルタドライバ66からファイルシステム61へは、ファイルシステム61からマルチリーダ/ライタ1へのデータの出力がNGである旨を示すステータスが発行される[95]。
このステータスが発行されると、ファイルシステム61によりSCSIコマンド「RequestSense」が発行される[95a]。このSCSIコマンド「RequestSense」が発行されると、ファイルドライバ62は、メモリ無しを示すセンスデータを転送する[95b]。
そのセンスデータを受信したファイルシステム61は、再度SCSIコマンド「Read/Write(V−LUN=0)」を発行する[96]。これを受信したフィルタドライバ66は、V−LUN0に対応するP−LUNを指定して、順番に、SCSIコマンド「TestUnitReady」を発行し、その返答を受け取る[97]。ここでは、第2外部メモリ22がスロット12に挿入されたままであって、実論理ユニット(P−LUN2)について「Ready」の返答が得られたものとして説明する。
実論理ユニット(P−LUN2)について「Ready」の返答が得られた場合、実論理ユニット(P−LUN2)を、仮想論理ユニット(V−LUN0)に対応する実論理ユニットPUとして新たに登録する。
次に、SCSIコマンド「Read/Write(V−LUN=0)」に続いて、ファイルシステム61から、データが出力された場合であっても[101]、その出力データはフィルタドライバ66により読み捨てられ、マルチリーダ/ライタ1には送信されない。
そして、フィルタドライバ66からファイルシステム61へは、ファイルシステム61からマルチリーダ/ライタ1へのデータの出力がNGである旨を示すステータスが発行される[102]。
このステータスが発行されると、ファイルシステム61によりSCSIコマンド「RequestSense」が発行される[102a]。このSCSIコマンド「RequestSense」が発行されると、ファイルシステム61は、メモリ交換発生を示すセンスデータを転送する[102b]。
このセンスデータを受信したファイルシステム61では、前回使用されたメモリ管理情報を破棄する。また、ファイルシステム61は、再度、SCSIコマンド「Read/Write(V−LUN=0)」を発行する[103]。なお、今度は、仮想論理ユニット(V−LUN0)に対応するアクセス可能実論理ユニットとして、新たに装着された外部メモリ22に対応する実論理ユニット(P−LUN2)が登録済みである。
よって、ファイルシステム61からSCSIコマンド「Read/Write(V−LUN=0)」が発行されると、フィルタドライバ66は、発行されたSCSIコマンドを、SCSIコマンド「Read/Write(P−LUN2)」に変更し、マルチリーダ/ライタ100に発行する[104]。
これにより、ファイルシステム61とマルチリーダ/ライタ1との間でデータの読み書きが行えるようになる。[105],[106]。
図14を参照して、フィルタドライバ66によりPC30で実行されるSCSIコマンド受信処理について説明する。図14は、フィルタドライバ66によりPC30で実行されるSCSIコマンド受信処理を示すフローチャートである。このSCSIコマンド受信処理は、OSからSCSIコマンドが発行される場合に実行される。
まず、OSが発行したSCSIコマンドが、「Inquiry」であるか否かを判断する(S40)。SCSIコマンドが「Inquiry」である場合(S40:Yes)、Inquiry処理を実行する(S42)。このInquiry処理により、フィルタドライバ66は、所定のInquiry情報をOSに返却し、本処理を終了する。
一方、OSが発行したSCSIコマンドが「Inquiry」ではない場合(S40:No)、次に、そのSCSIコマンドが、「RequestSense」であるか否かを判断する(S44)。ここではまず、OSが発行したSCSIコマンドが「RequestSense」ではなく(S44:No)、また、センスデータが無い(S46:No)ものとして説明する。
次にOSが発行したSCSIコマンドに記述されたV−LUNについて、アクセス可能な実論理ユニットPUが登録済みであるか否かを判断する(S48)。アクセス可能な実論理ユニットPUが未登録の場合(S48:No)、SCSIコマンドに記述されたV−LUNに対応するP−LUNを記述したSCSIコマンド「TestUnitReady」をマルチリーダ/ライタ100に発行し、Readyの返答が得られる実論理ユニットを検出する(S52)。なお、この処理については、図13における[71]から[78]を参照して説明したので、これ以上の詳細な説明は省略する。そして、Readyの返答が得られたP−LUNがあった場合(S52:Yes)、そのP−LUNの実論理ユニットPUをアクセス可能な実論理ユニットとして登録する(S54)。そして、タイマーをリセットし(S56)、「メモリ交換」をセンスデータに格納し(S58)、処理を終了する。
一方、Readyの返答が得られる実論理ユニットPUが存在しなかった場合(S52:No)、すなわち、外部メモリのいずれも装着されておらず、また、「メモリ無し」をセンスデータに格納し(S60)、処理を終了する。
なお、センスデータ有りの状態でこのSCSIコマンド受信処理を終了した場合、フィルタドライバ66からOSへは、データ通信がNGであることを示すステータスが発行される。そして、データ通信がNGであることを示すステータスがフィルタドライバ66から発行されると、OSからは、センスデータを要求するSCSIコマンド「RequestSense」が発行される。OSからSCSIコマンド「RequestSense」が発行されると(S44:Yes)、フィルタドライバ66は、センスデータを転送すると共に、転送後はそのセンスデータをクリアし(S62)、SCSIコマンド受信処理を正常に終了する。なお、図14に示すフローチャートに示すように、センスデータが有る間は(S46:Yes)、もし、OSからSCSIコマンド「Inquiry」、または「RequestSense」以外のコマンドが発行された場合は全てエラー終了し、フィルタドライバ66からOSへは、データ通信がNGであることを示すステータスが再発行される。
一方、OSが発行したSCSIコマンドに記述されたV−LUNについてのアクセス可能な実論理ユニットPUが登録済みであり(S48:Yes)、且つ、その登録済みの実論理ユニットPUに対応付けられたメモリが外部メモリであって、内蔵フラッシュメモリ15ではない場合(S64:No)、SCSIコマンドに記述されたV−LUNをアクセス可能実論理ユニットとして登録されたP−LUNに変更してマルチリーダ/ライタ100に発行する(S66)。そして、マルチリーダ/ライタ100からエラー(NG)の返答を受信しない場合(S68:No)はS74の処理に進む。
一方、マルチリーダ/ライタ100からエラーの返答を受信した場合(S68:Yes)、SCSIコマンド「RequestSense」を、マルチリーダ/ライタ100に発行し、その結果をV−LUNのセンスデータに格納する(S70)。次に、スロットに外部メモリが入っていないかを判断する(S72)。スロットに外部メモリが入っていない場合(S72:Yes)、これは、前回アクセスした外部メモリがスロットから抜き取られたことを意味しているから、S78の処理に進み、アクセス可能な実論理ユニットとして登録されていたP−LUNを解除する処理を行う。一方、スロットに外部メモリが入っている場合(S72:No)、S74の処理に進む。
次に、OSから発行されたSCSIコマンドが、「TestUnitReady」であるか否かを判断する(S74)。OSから発行されたSCSIコマンドが「TestUnitReady」以外であった場合(S74:No)、タイマーをリセットし(S76)、処理を終了する。一方、OSから発行されたSCSIコマンドが、「TestUnitReadyである場合(S74)、タイマーをリセットせずに処理を終了する。
アクセス可能実論理ユニットとして登録されている実論理ユニットPUが、内蔵フラッシュメモリ15が対応付けられたものであり(S64:Yes)、かつ、タイマーの値が20秒以上となると(S80)、次に、SCSIコマンドに記述されたV−LUNに対応付けられるP−LUNであって、内蔵フラッシュメモリ15が対応付けられたP−LUN以外のものを記述したSCSIコマンド「TestUnitReady」を発行する(S82)。そして、Readyの返答が得られるP−LUNが有るか否かを判断する(S84)。Readyの返答が得られるP−LUNが無かった場合(S84)、すなわちスロットに新たに装着された外部メモリが存在しなかった場合、S66の処理に移行する。
一方、Readyの返答が得られるP−LUNが有った場合(S84:Yes)、それまでアクセス可能な実論理ユニットPUとして登録されていた実論理ユニットを登録から解除し、V−LUNを未登録状態に戻す(S78)。そして、「メモリ無し」をセンスデータに格納し(S60)、処理を終了する。
図15を参照して、第3実施例におけるLUNレイアウト設定画面について説明する。図15は、第3実施例のLUNレイアウト設定画面の一例を示す図である。なお、図15に示すLUNレイアウト設定画面において、第1実施例で説明したLUNレイアウト設定画面と同一の構成については同一の符号を付して説明を省略する。
図15に示すように、第3実施例のLUNレイアウトツール64では、3種類のレイアウトが予め登録されており、LUNレイアウト設定画面において「1ドライブのみで自動切替」ボタン55、「内蔵フラッシュのみ独立」ボタン56、「全ドライブ独立」ボタン57をクリックすることで、そのクリックしたボタンに対応したレイアウトが自動的に設定される。そのため、ユーザの操作負担を軽減することが可能となる。
具体的には、「1ドライブのみで自動切替」ボタン55をクリックすると、図15(a)に示すように、全てのアイコンが仮想論理ユニット(V−LUN0)の枠に自動的に配置される。また、「内蔵フラッシュのみ独立」ボタン56をクリックすると、図15(b)に示すように、内蔵フラッシュメモリ15に対応する実論理ユニット(P−LUN0)のアイコンが仮想論理ユニット(V−LUN0)の枠に自動的に配置されると共に、その他のアイコンが全て仮想論理ユニット(V−LUN1)の枠に自動的に配置される。また、「全ドライブ独立」ボタン57をクリックすると、図15(c)に示すように、各アイコンが各仮想論理ユニット(V−LUN0,V−LUN1,V−LUN2,V−LUN3)の枠に自動的に一つずつ配置される。
しかしながら、ユーザが各自動設定ボタン55〜57をクリックすることで自動的にレイアウトが行われた後でも、ユーザが設定ボタン51をクリックするまでは、ユーザはレイアウトを自由に変更することができる。このため、既定のレイアウトを一部だけ変更したい場合等、ユーザは自由にレイアウトを設定することができる。
なお、内蔵フラッシュメモリ15に対応する実論理ユニット番号が、P−LUN0であることは、例えば、以下のような方法で自動判断することができる。まず、全てのスロットのメモリカードを抜いてPC30を再起動(もしくはUSBケーブル抜き差し)する。このときフィルタドライバロード時に1つだけReadyの実論理ユニットが有れば、それが内蔵フラッシュ15に対応する実論理ユニットであると判断できる。
以上、実施例に基づき本発明を説明したが、本発明は上述した実施例に何ら限定されるものではなく、本発明の趣旨を逸脱しない範囲内で種々の改良変更が可能であることは容易に推察できるものである。
例えば、本実施例では、マルチリーダ/ライタ1の実論理ユニットPUを全ていずれかの仮想論理ユニットVUに対応付けていたが、必ずしも、全ての実論理ユニットPUを、仮想論理ユニットVUに対応付けなくてもよい。特に使用頻度の低い実論理ユニットPUについては、LUNレイアウト設定画面(図4(a)、図15参照)において、いずれの仮想論理ユニットVUにも対応付けないようにLUNレイアウトを設定することにより、PC30からアクセスできないように設定することができる。このようにすれば、例えば「絶対に使用しないメディアについてはPCからも認識されないようにしたい」と厳格に決めておきたいという場合などに有効となる。
また、上記5種類のメディア(CF,SM,MS,SD,内蔵フラッシュメモリ15)に限らず、マイクロドライブ、マルチメディアカード、XDピクチャカード、メモリースティックDUO、さらにはPCカード等の種々のメディアを挿入可能なマルチリーダ/ライタに対しても、上記各実施例で説明したように、本発明を適用できることはいうまでもない。