【コンピュータサイエンスの独学】デバイスファイルとシステムコール
デバイスファイル
デバイスファイルはデバイス(ハードウェア)をファイルとして表現したものです。
アプリケーション(ユーザー空間)とデバイスドライバ(カーネル空間)間でデータを送受信するためには、両者を結びつける「何か」が必要です。
その「何か」がデバイスファイルです。
デバイスファイルは通常、「/dev」配下に保存されており、原則ひとつのデバイスに対して、ひとつのデバイスファイルが存在します。
例えば、「/dev/hda」ファイルは1台目のIDE(ATA)ハードディスクを表しています。
「表している」とはつまり、ソフトウェア(ユーザー空間)から見れば、「/dev/hda」がIDEハードディスクあると見えるわけです。
そしてこのファイルを操作することは、IDEハードディスクを操作するということに対応します。
デバイスファイルには下記の種別が存在します。
・ブロック型デバイス(block)
・キャラクタ型デバイス(character, unbuffered)
・名前付きパイプ(pipe)
ハードディスクやUSBメモリはブロック型デバイス、プリンタやモデムはキャラクタ型デバイスに該当します。
名前付きパイプはプロセス間通信を行う際に使用するデバイスファイルです。
システムコール
前述のとおり、アプリケーション(ユーザー空間)とデバイスドライバ(カーネル空間)間でデータを送受信するために、デバイスファイルを使用するします。
このデバイスファイルを操作することが、デバイス(ハードウェア)を操作することにつながります。
それはつまり、デバイスファイルがデバイス(ハードウェア)を表しているということです。
では、デバイスファイルの操作はどのように行うのでしょう。
その方法が「システムコール」というわけです。
システムコールにはいくつか種類がありますが、まずは基本的な下記の4つについて考えてみます。
・open
・close
・read
・write
デバイスファイルは特殊なファイルではありますが、ファイルであることには変わりありません。
ですので、まずファイルを開いてやる必要があります。
そのためのシステムコールが「open」です。
あとはデバイスに対して何らかのデータを送ったり、受け取ったりする方法です。
「read」がデータを読み込む、つまり、デバイスから送られるデータを受け取るためのシステムコールです。
逆に「write」はデータを書き込む、つまり、デバイスにデータを送るためのシステムコールとなります。
そして最後に、用が済んだら開いていたファイルを閉じてやる必要があります。
そのためのシステムコールが「close」です。
このようにデバイス(ハードウェア)を操作してくわけです。
これらの手順は、普通のテキストファイルをプログラム上から扱うときとそっくりだということがわかります。