ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 10 8/11 Information Library (日本語) |
この節では、デバイスコンテキストとコンテキスト管理モデルの概要を説明します。
デバイスのコンテキストとは、デバイスハードウェアの現在の状態のことです。あるプロセスのデバイスコンテキストは、そのプロセスに代わってデバイスドライバによって管理されます。ドライバは、デバイスにアクセスするプロセスごとに異なるデバイスコンテキストを維持管理する必要があります。デバイスドライバは、あるプロセスがデバイスにアクセスするときに正しいデバイスコンテキストの復元を担当します。
フレームバッファーは、デバイスコンテキスト管理の良い例になります。高速化フレームバッファーでは、ユーザープロセスがメモリーマッピングされたアクセス経由でデバイスの制御レジスタを直接操作できます。これらのプロセスは従来のシステムコールを使用しないため、デバイスにアクセスするプロセスからデバイスドライバを呼び出す必要はありません。一方、あるプロセスがデバイスにアクセスしようとしたときに、デバイスドライバにそれが通知される必要があります。ドライバは、正しいデバイスコンテキストを復元する必要があるほか、必要とされるすべての同期機能を提供する必要もあります。
この問題を解決するため、デバイスコンテキスト管理インタフェースでは、デバイスドライバが、あるユーザープロセスがデバイスのメモリーマッピングされた領域にアクセスしたときに通知を受け取り、デバイスのハードウェアへのアクセスを制御できるようになっています。さまざまなデバイスコンテキストの同期や管理は、デバイスドライバが担当します。あるユーザープロセスがマッピングにアクセスしたときに、デバイスドライバはそのプロセスの正しいデバイスコンテキストを復元する必要があります。
ユーザープロセスが次のいずれかのアクションを実行するたびに、デバイスドライバにそれが通知されます。
次の図は、1 つのデバイスに対して複数のユーザープロセスからメモリーマッピングが行われている様子を示したものです。ドライバがデバイスへのアクセスをプロセス B に許可したため、プロセス B がアクセスしても、その通知はドライバには送信されません。一方、プロセス A またはプロセス C のいずれかがデバイスにアクセスした場合は、引き続き、ドライバにそれが通知されます。
将来のある時点で、プロセス A がデバイスにアクセスします。デバイスドライバはその通知を受け取り、プロセス B からデバイスへのその後のアクセスをブロックします。次にプロセス B のデバイスコンテキストを保存します。ドライバはプロセス A のデバイスコンテキストを復元し、続いてプロセス A にアクセスを許可します。この流れを示したのが次の図です。この時点で、プロセス B またはプロセス C のいずれかがデバイスにアクセスすると、デバイスドライバにそれが通知されるようになります。
図 11-2 デバイスコンテキストがユーザープロセス A に切り替わる様子
マルチプロセッサマシンでは、複数のプロセスが同時にデバイスへのアクセスを試みる可能性があります。この状況ではスラッシングが生じる可能性があります。一部のデバイスでは、デバイスコンテキストの復元に、より長い時間が必要になります。デバイスコンテキストを実際に利用するときに使用される CPU 時間よりも、デバイスコンテキストを復元するときに使用される CPU 時間のほうが長くならないように、プロセスがデバイスにアクセスするときに最低限必要になる時間を、devmap_set_ctx_timeout(9F) を使用して設定できるようになっています。
カーネルは、デバイスドライバがあるプロセスにアクセスをいったん許可すると、devmap_set_ctx_timeout(9F) で指定された時間間隔の間、同じデバイスへのアクセスをほかのプロセスから一切要求できなくなることを保証します。