デバイスファイルとは
デバイスファイル(またはスペシャルファイル)とは、
ファイルシステム上で、あたかも通常のファイルのように扱われる
デバイスドライバのインターフェースです。これにより、
ソフトウェアは
入出力システムコールを通して
デバイスドライバを簡単に利用でき、作業が効率化されます。
デバイスファイルは、
プリンターなどの
周辺機器への簡単なアクセスを提供し、ディスク
パーティションなどの特定の機器リソースへのアクセスにも使用されます。さらに、/dev/nullや擬似乱数生成器のように、特定の機器には対応しないリソースへのアクセスも可能です。
[UNIX]]やUnix系の
オペレーティングシステム]では、デバイスファイルを「デバイスノード」と呼びます。これらはキャラクタデバイスとブロックデバイスに分類され、OSと[[ハードウェア間のデータ
入出力方法に違いがあります。また、名前付きパイプなどの特殊なオブジェクトと区別するために、「デバイススペシャルファイル」と呼ばれることもあります。
実装
デバイスノードは、OSの
カーネルが既に確保しているリソースに対応します。
UNIXでは、これらのリソースは「メジャー番号」と「マイナー番号」で識別され、ノードの構造体の一部として格納されます。これらの番号の割り当て方はOSやプラットフォームによって異なりますが、一般的にメジャー番号が
デバイスドライバを識別し、マイナー番号がそのドライバが制御する個々の機器を識別するために使われます。システムはドライバに対し、マイナー番号を引数として渡します。
システムはデバイスノードを通常ファイルのように扱い、標準的なシステムコールを使ってアクセスします。
キャラクタデバイス
キャラクタデバイス(またはキャラクタスペシャルファイル)は、システムがデータを一文字ずつ転送する機器に対応します。
テレタイプ[[端末]]、
モデム、仮想
コンソール、擬似
端末などのバイトストリーム型機器を扱い、データの
ランダムアクセスは通常サポートされていません。
多くの実装では、キャラクタデバイスは
バッファを使用しない
入出力を行います。システムは文字単位で逐次的に読み書きを行います。
ブロックデバイス
ブロックデバイス(またはブロックスペシャルファイル)は、ブロック形式でデータをやり取りする機器に対応します。
ハードディスクドライブ、
CD-ROMドライブ、メモリ領域などのアドレス指定可能な機器を扱います。
ブロックデバイスは
ランダムアクセスとシークが可能であることが多く、一般的に
バッファを使った
入出力を行います。OSは個々の
入出力用に1つのブロックを保持するための
バッファを確保します。プログラムがデータの読み書きを要求すると、システムは適切な
バッファを用意してデータを保持します。
バッファが一杯になると適切な操作(
データ転送)が行われ、システムが
バッファをクリアします。
擬似デバイス
UNIXや
Unix系OSでは、実際の
周辺機器に対応しないデバイスノードも存在します。これらは「擬似デバイス」と呼ばれ、OSが制御する様々な機能を提供します。
以下は、よく利用される擬似デバイスの例です。
/dev/null: あらゆる入力を受け付け、それを破棄します。出力はしません。いわゆるビットバケツとして機能します。
/dev/zero:
ASCIIのNUL文字(値がゼロ)の列を生成します。
/dev/random: 可変長の擬似乱数文字列を生成します(ブロックあり)。
/dev/urandom: 可変長の擬似乱数文字列を生成します(ブロックなし)。
慣習的な命名
以下は、
Linuxディストリビューションでよく使われるデバイスノード名のプレフィックスです。
fd: フロッピーディスク
hd: IDE
ハードディスクドライブ
lp: プリンター
par:
パラレルポート
pt: 擬似端末(仮想端末)
s: SCSIデバイス一般。特に
ハードディスクドライブ。
scd: SCSI接続の音声用光ディスク装置
sd: SCSI接続のハードディスク
sg: SCSI接続の汎用装置
sr: SCSI接続のデータ用光ディスク装置
st: SCSI接続の磁気テープ
tty: (物理)
端末
これらのプレフィックスの後には、特定の機器に対応する固有の番号が付与されることが一般的です。
ハードディスクドライブの場合、ドライブを特定する番号の後に
パーティションを特定する番号が続きます。例えば、`/dev/sda3`はディスク上の領域を表し、`/dev/pts/14`はネットワーク経由の
端末セッションを表します。
Fedoraなどの一部の
Linuxディストリビューションでは、sdがあらゆるディスクドライブに使われるようになっています。
MS-DOS・Windowsにおけるデバイスファイル
MS-DOSは、
UNIXからスペシャルファイルの概念を導入し、それをデバイスファイルと呼びました。初期の
MS-DOSは
ディレクトリ階層をサポートしていなかったため、デバイスファイルを通常のファイルと区別するために、それらの名称を
予約語として扱いました。つまり、特定の
ファイル名はデバイスファイル用に予約されており、同じ名前のファイルや
ディレクトリを新たに作成することはできませんでした。
予約された名称は、
CP/M|CP_MのPIPコマンドでの「スペシャルファイル」と互換性があるように選ばれました。この仕組みはWindowsにも引き継がれ、予約デバイス名とも呼ばれています。
予約語に
拡張子を付与した場合でも、同様に予約されたデバイスとして解釈されます。例えば、`nul.doc`や`con.htm`は
ファイル名ではなく、それぞれNULとCONデバイスとして扱われます。また、`C:\WINDOWS\CON`のようにパス名の一部に含まれていても予約デバイス名として解釈されます。MSCDEXと
CD-ROMドライバ間で使用されるデバイス名も、同様に予約デバイス名として扱われます。
CONCON問題
CONCON問題は、
Windows 9x系の予約名の扱いにおけるバグを悪用し、対象コンピュータをフリーズさせる攻撃として知られています。例えば、`C:\CON\CON`へのリンクを含むウェブページを用意し、それをクリックさせるといった手法が用いられました。これは、9x系OSにおいて、予約デバイス名が複数回現れるパスを指定してファイルを開こうとすると、システムがフリーズしてしまうというバグを利用したものです。
関連項目
ブロック (データ)
バッファ
*
ファイルシステム