Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

デバイスドライバの基本

このセクションでは、Oracle Solaris プラットフォームでのデバイスドライバとそのエントリポイントについて説明します。

デバイスドライバとは

デバイスドライバとは、ハードウェアデバイスの低レベルの入出力操作を管理するカーネルモジュールのことです。デバイスドライバは、カーネルがデバイスとのインタフェースを取るために呼び出すことのできる標準的なインタフェースで書かれています。また、デバイスドライバをソフトウェア専用にして、RAM ディスク、バス、擬似端末など、ソフトウェアでのみ存在するデバイスをエミュレートすることもできます。

デバイスドライバには、デバイスとの通信に必要なデバイス固有のすべてのコードが含まれています。このコードには、システムの残りの部分へのインタフェースの標準セットが含まれています。このインタフェースは、システムコールインタフェースがアプリケーションプログラムをプラットフォーム固有の詳細から保護するように、カーネルをデバイス固有の詳細から遮蔽します。アプリケーションプログラムやカーネルの残りの部分では、デバイスに対応するためのデバイス固有のコードがたとえあったとしても、ほとんど必要ありません。このような点で、デバイスドライバはシステムの移植性を高め、システムの保守を容易にします。

Oracle Solaris オペレーティングシステム (Oracle Solaris OS) が初期化されると、デバイスは自らを識別し、デバイスの階層であるデバイスツリーに編成されます。実際には、デバイスツリーはカーネルのハードウェアモデルです。ツリー内では、個々のデバイスドライバは子を持たないノードで表されます。このようなノードは、リーフドライバと呼ばれます。ほかのドライバにサービスを提供するドライバはバスネクサスドライバと呼ばれ、子を持つノードで表されます。ブートプロセスの一環として、物理デバイスがツリー内のドライバにマップされるため、必要なときにそれらのドライバを特定できるようになります。Oracle Solaris OS によるデバイスへの対応の仕方についての詳細は、Oracle Solaris カーネルとデバイスツリーを参照してください。

デバイスドライバは入出力の処理方法によって分類されます。デバイスドライバは 3 つの大まかなカテゴリに分類されます。

  • ブロックデバイスドライバ – 入出力データを非同期のチャンクとして処理することが適切な場合。ブロックドライバは通常、ディスクなどの物理的にアドレス可能な記憶メディアでデバイスを管理するために使用されます。

  • 文字デバイスドライバ – 入出力を連続的なバイトの流れで実行するデバイス向け。


    注 - ファイルシステムに対して 2 つの異なるインタフェースを設定した場合は、1 つのドライバを同時にブロックと文字の両方のドライバとして使用できます。特殊ファイルとしてのデバイスを参照してください。

    STREAMS モデル (下記を参照) を使用するドライバ、プログラム式入出力、ダイレクトメモリーアクセス、SCSI バス、USB、その他のネットワーク入出力は文字カテゴリに含まれます。

  • STREAMS デバイスドライバ - カーネル内の文字入出力に対して streamio(7I) セットのルーチンを使用する文字ドライバのサブセット。

デバイスドライバのエントリポイントとは

エントリポイントとは、なんらかのドライバ機能を利用したり、デバイスを操作したりするために外部エンティティーから呼び出すことができるデバイスドライバ内の関数のことです。各デバイスドライバには、エントリポイントとして関数の標準セットが用意されています。すべてのドライバタイプ用のエントリポイントの一覧については、Intro(9E) のマニュアルページを参照してください。Oracle Solaris カーネルでは、次の一般的なタスク領域でエントリポイントを使用します。

  • ドライバのロードとアンロード

  • デバイスの自動構成 – 自動構成とは、デバイスドライバのコードと静的データをメモリーにロードして、ドライバがシステムに登録されるようにするプロセスです。

  • ドライバへの入出力サービスの提供

各種デバイスのドライバには、デバイスが実行する処理の種類に応じてさまざまなエントリポイントのセットがあります。たとえば、メモリーマッピングされた文字指向デバイスは devmap(9E) エントリポイントをサポートしますが、ブロックドライバはこのエントリをサポートしません。

ドライバ関数に一意の名前を付けるには、ドライバの名前に基づく接頭辞を使用します。通常、この接頭辞はドライバの名前になります (たとえば、xx_open() はドライバ xxopen(9E) ルーチンを表しています)。詳細は、一意の接頭辞を使用してカーネルシンボルの衝突を回避するを参照してください。このドキュメントの以降の例では、xx をドライバ接頭辞として使用します。