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

印刷ビューの終了

更新: 2016 年 11 月
 
 

カーネルとは

Oracle Solaris カーネルは、システムリソースを管理するプログラムです。カーネルはシステムハードウェアからアプリケーションを隔離し、入出力 (I/O) 管理、仮想メモリー、スケジューリングなどの重要なシステムサービスをアプリケーションに提供します。カーネルは、必要なときにメモリーに動的にロードされるオブジェクトモジュールから構成されます。

Oracle Solaris カーネルは論理的に 2 つの部分に分割できます。カーネルと呼ばれる最初の部分は、ファイルシステム、スケジューリング、および仮想メモリーを管理します。I/O サブシステムと呼ばれる 2 番目の部分は物理コンポーネントを管理します。

カーネルは、アプリケーションがシステムコールを介してアクセスできるインタフェースのセットを提供します。システムコールについては、リファレンスドキュメントコレクション(Intro(2)を参照) の第 2 セクションに説明があります。一部のシステムコールは、デバイスドライバを呼び出して入出力を実行するために使用されます。デバイスドライバはロード可能なカーネルモジュールであり、カーネルの残りの部分をデバイスハードウェアから隔離しながら、データ転送を管理します。オペレーティングシステムとの互換性を確保するため、デバイスドライバはマルチスレッド化、仮想メモリーアドレス指定、32 ビットと 64 ビット両方の操作などの機能に対応できる必要があります。

次の図はカーネルを示しています。カーネルモジュールはアプリケーションプログラムからのシステムコールを処理します。I/O モジュールはハードウェアと通信します。

図 2  Oracle Solaris カーネル

image:図は、ユーザーレベルのアプリケーションから特定のカーネルレベルモジュールへの呼び出しと、ドライバ間およびその他のモジュールからデバイスへの呼び出しを示しています。

カーネルは次の機能を通してデバイスドライバへのアクセスを提供します。

  • デバイスからドライバへのマッピング。カーネルはデバイスツリーを維持管理します。ツリー内の各ノードは仮想デバイスまたは物理デバイスを表します。カーネルはデバイスノード名を、システムにインストールされているドライバのセットと照合し、各ノードをドライバにバインドします。アプリケーションからデバイスにアクセスできるようになるのは、ドライバのバインドが存在する場合のみです。

  • DDI/DKI インタフェース。DDI/DKI (デバイスドライバインタフェース/ドライバカーネルインタフェース) インタフェースは、ドライバと、カーネル、デバイスハードウェア、およびブート/構成ソフトウェアとの間の対話処理を標準化します。これらのインタフェースは、カーネルからのドライバの独立を維持し、特定システムでの継続的なオペレーティングシステムのリリース全体にわたってドライバの移植性を向上させます。

  • LDI。LDI (階層化ドライバインタフェース) は DDI/DKI の拡張機能です。カーネルモジュールは LDI によってシステム内のその他のドライバにアクセスできます。LDI を使用すると、カーネルによって現在使用されているデバイスを特定することもできます。階層化ドライバインタフェース (LDI)を参照してください。

マルチスレッドの実行環境

Oracle Solaris カーネルはマルチスレッドです。マルチプロセッサシステムでは、複数のカーネルスレッドでカーネルコードを実行可能であり、カーネルコードを平行して実行できます。カーネルスレッドも、いつでもその他のカーネルスレッドに横取りできます。

カーネルのマルチスレッド化では、デバイスドライバにいくつかの追加の制限が発生します。マルチスレッドの考慮事項の詳細情報については、マルチスレッドを参照してください。デバイスドライバのコードは、多くの異なるスレッドの要求時に必要に応じて実行されるように記述する必要があります。ドライバはスレッドごとに、I/O 要求が重なることで発生する競合の問題を処理する必要があります。

仮想メモリー

Oracle Solaris 仮想メモリーシステムの全体的な概要については、このドキュメントが対象とする範囲に含まれていませんが、デバイスドライバについて説明するときに特に重要な仮想メモリー用語として、仮想アドレスとアドレス空間という 2 つの用語を使用しています。

  • 仮想アドレス仮想アドレスは、メモリー管理ユニット (MMU) によってハードウェアの物理アドレスにマップされたアドレスです。ドライバによって直接アクセスできるアドレスはすべて、カーネル仮想アドレスです。カーネル仮想アドレスは、カーネルアドレス空間を参照します。

  • アドレス空間アドレス空間は、仮想アドレスセグメントのセットです。各セグメントは、連続した範囲の仮想アドレスです。各ユーザープロセスは、ユーザーアドレス空間と呼ばれるアドレス空間を持ちます。カーネルには、カーネルアドレス空間と呼ばれる独自のアドレス空間があります。

特殊ファイルとしてのデバイス

デバイスは、ファイルシステム内では特殊ファイルによって表されます。Oracle Solaris OS では、これらのファイルは /devices ディレクトリ階層にあります。

特殊ファイルは、ブロック型または文字型のいずれかです。この型は、どの種類のデバイスドライバがデバイスを操作するかを示します。ドライバは両方の型で動作するように実装できます。たとえば、ディスクドライバは fsck(1) および mkfs(1) ユーティリティーで使用するために文字インタフェースをエクスポートし、ファイルシステムで使用するためにブロックインタフェースをエクスポートします。

各特殊ファイルにはデバイス番号 ( dev_t) が関連付けられます。デバイス番号はメジャー番号マイナー番号から構成されています。メジャー番号は、その特殊ファイルに関連付けられているデバイスドライバを識別します。マイナー番号は、特殊ファイルをさらに区別するために、デバイスドライバによって作成され、使用されます。通常、マイナー番号は、ドライバがアクセスする必要があるデバイスインスタンスと、実行する必要のあるアクセスの種類を識別するために使用されるエンコードです。たとえば、マイナー番号によって、バックアップのために使用されるテープデバイスを識別し、バックアップ操作が完了したときにはテープを巻き戻す必要があることを指定できます。

DDI/DKI インタフェース

System V Release 4 (SVR4) では、デバイスドライバと残りの UNIX カーネルとの間のインタフェースが DDI/DKI として標準化されました。DDI/DKI については、リファレンスドキュメントコレクションの第 9 セクションに説明があります。第 9E セクションにはドライバのエントリポイントについての説明、第 9F セクションにはドライバから呼び出すことができる関数についての説明、第 9S セクションにはデバイスドライバによって使用されるカーネルのデータ構造についての説明があります。Intro(9E)Intro(9F)、およびIntro(9S)を参照してください。

DDI/DKI はデバイスドライバと残りのカーネルの間のインタフェースをすべて標準化し、ドキュメント化することを目的としています。さらに、DDI/DKI によって、Oracle Solaris OS を実行する任意のシステムでは、プロセッサのアーキテクチャーが SPARC であるか x86 であるかにかかわらず、ドライバのソースとバイナリの互換性が実現されます。DDI/DKI の一部になっているカーネル機能のみを使用するドライバは、DDI/DKI 準拠デバイスドライバと呼ばれます。

DDI/DKI を使用すると、Oracle Solaris OS を実行する任意のシステムのためにプラットフォームに依存しないデバイスドライバを記述できます。これらのバイナリ互換性があるドライバによって、サードパーティーのハードウェアとソフトウェアを、より簡単に Oracle Solaris OS を実行する任意のシステムに統合できます。DDI/DKI はアーキテクチャーに依存しないため、同じドライバが一連の多様なシステムアーキテクチャーにわたって動作可能です。

プラットフォームへの非依存は、次の領域における DDI のデザインによって実現されています。

  • モジュールの動的なロードおよびアンロード

  • 電源管理

  • 割り込み処理

  • カーネルプロセスまたはユーザープロセスからデバイス領域へのアクセス。つまり、レジスタマッピングとメモリーマッピング

  • DMA サービスを使用した、デバイスからのカーネルプロセス空間またはユーザープロセス空間へのアクセス

  • デバイスのプロパティーの管理