スポンサーリンク

INTRO(4) FreeBSD カーネルインタフェースマニュアル 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 で登場しました。

FreeBSD 2.1 January 20, 1996 FreeBSD 2.1

スポンサーリンク