INTRO(4)

名称
intro - デバイスおよびデバイスドライバの紹介

解説
本セクションではデバイス、デバイスドライバ、 その他ハードウェアに関連した情報を記します。

  デバイスの抽象化
デバイスとは多くの場合、ディスク、プリンタ、 あるいはキーボード付きのグラフィックスディスプレイのような、 システムに属すハードウェア関連の機材を表す用語です。 また、いわゆる 疑似デバイス というものもあります。これは、デバイスドライバが ソフトウェア的にデバイスの動作をエミュレートするもので、 特定のハードウェアを根幹として持ちません。 後者の類の典型的な例として /dev/mem があります。 これは通常ファイルと同じセマンティクスで 物理メモリにアクセスできる小穴のようなものです。

一般に、デバイスの抽象化の上位層では、 共通的なシステムコール群が提供されます。 これらのシステムコールはカーネルの上位層によって 対応するデバイスドライバへ送られます。 デバイスに利用できるシステムコール群は、 open(2), close(2), read(2), write(2), ioctl(2), select(2), mmap(2) から選ばれます。 すべてのドライバがこれらのシステムコールすべてを 実装しているわけではありません。例えば、 mmap(2) を端末デバイス上で呼び出しても何の役にも立たないでしょう。

  デバイスへのアクセス
UNIX 風オペレーティングシステム下のほとんどのデバイスには、 いわゆる デバイスノード 、あるいは 特殊ファイル とも呼ばれるものを介してアクセスします。 これは通常はそのファイルシステム階層の /dev ディレクトリ下に置かれます。 (hier(7) を参照) 。

devfs(5) が完全に機能していなければ、各デバイスノードは静的に、 かつ関連するデバイスドライバの存在とは無関係に、作成される必要があります。 大抵は MAKEDEV(8) を実行させて作成します。

これはつまり、一貫した状態にならないかもしれないということです。 関連するドライバが設定されていないようなデバイスノードが 存在するかもしれませんし、デバイスの検出に成功したのに、 対応するデバイスノードがまだ無いために アクセスできないドライバが存在するかもしれません。 前者の場合では、そのデバイスノードを通してデバイスを参照しようとしても、 カーネルの上位層からエラーが返されます。 通常このエラーは ‘ENXIO’ です。 後者の場合では、ドライバとデバイスを使えるようにするには、 デバイスノードを作成する必要があります。

デバイスによっては 2 種類に分かれることがあります。 ブロック型 (block) デバイス と キャラクタ型 (character) デバイス です。より正確に言えばすなわち、 バッファリングされるデバイスとバッファリングされないデバイス (raw デバイス) です。 ‘ls -l’ の出力では、ファイルの型の識別に文字 ‘b’ と ‘c’ で慣習的な呼び名を表しています。 バッファリングされるデバイスは、 オペレーティングシステムのバッファキャッシュを経由してアクセスされています。 そして、このようなデバイスは、その上位にファイルシステムを 重ねることのみを目的としています。 通常、バッファリングされるデバイスは、 ディスクやディスク風デバイス、 それに歴史的な理由からテープデバイスにのみ実装されます。

raw デバイスはすべてのドライバに利用できます。 これにはバッファリングされるデバイスも実装するようなドライバも含みます。 そのようなデバイスでは、慣習的にデバイスノードのパス名に文字 ‘r’ を前置して違いを表します。 例えば、 /dev/rda0 は 1 台目の SCSI ディスク用の raw デバイスを表します。一方、 /dev/da0 は同じくバッファリングされるデバイスのデバイスノードです。

バッファリングされないデバイスは、 ファイルシステム操作に関連しない動作すべてに用いられるでしょう。 これはそのデバイスがディスクデバイスだとしてもです。 これには、ディスクパーティション全体のバックアップを取るときや、 raw フロッピディスクへバックアップする場合を含みます (このとき、フロッピディスクはテープのように使われます) 。

デバイスノードへのアクセス制限は、 カーネル内部のドライバによって直接に暗黙指定されているわけではなく、 普通はそのデバイスノードエントリの通常ファイルパーミッションの問題です。

  デバイスノードを持たないドライバ
ネットワークデバイス用のドライバにアクセスするときには デバイスノードは使いません。 これらのドライバはカーネル内部の別の判断で選択されます。 また一般的にネットワークデバイスの利用は、 open(2) を呼び出すのではなく、 socket(2) システムコールでおこなわれます。

  カーネルにドライバを組み込む
各カーネルには、そのカーネルの機能やドライバを選択したり 各種オプションを調整するための基礎として用いられる、設定ファイルが存在します。 関連するファイルの詳細な記述については config(8) を参照してください。 本セクションの個々のマニュアルページは、 設定ファイルのサンプル行をその書式セクションに提示しています。 設定ファイルのサンプルとして ( i386 アーキテクチャ用の) /sys/i386/conf/LINT も参照してください。

関連項目
close(2), ioctl(2), mmap(2), open(2), read(2), select(2), socket(2), write(2), devfs(5), hier(7), config(8), MAKEDEV(8)

作者
本マニュアルページは David E. O'Brien の投稿を元に Joerg Wunsch が書きました。

歴史
intro は FreeBSD 2.1 で登場しました。