Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

マッピングへのアクセスの管理

有効なマッピング変換を持たないメモリーマッピングされた領域内のアドレスにユーザープロセスがアクセスすると、デバイスドライバに通知されます。アクセスイベントが発生した場合、デバイスに現在アクセスしているプロセスのマッピング変換を無効化する必要があります。デバイスへのアクセスを要求したプロセスのデバイスコンテキストを復元する必要があります。さらに、アクセスを要求しているプロセスのマッピング変換を有効化する必要があります。

マッピング変換を有効化および無効化するには、関数 devmap_load(9F) およびdevmap_unload(9F) を使用します。

devmap_load() エントリポイント

devmap_load(9F) の構文は次のとおりです。

int devmap_load(devmap_cookie_t handle, offset_t offset,
    size_t len, uint_t type, uint_t rw);

devmap_load() は、handleoffset、および len で指定されるマッピングページのマッピング変換を有効化します。ドライバは、これらのページのマッピング変換を有効化することで、これらのマッピングのページへのアクセスを横取りしないようシステムに指示しています。さらにシステムは、デバイスドライバへの通知を行わないでアクセスの処理続行を許可してはいけません。

アクセスが完了するためには、アクセスイベントを生成したマッピングのオフセットとハンドルを指定して devmap_load() を呼び出す必要があります。このハンドルで devmap_load(9F) が呼び出されなかった場合、マッピング変換が有効化されないため、プロセスは SIGBUS を受信します。

devmap_unload() エントリポイント

devmap_unload(9F) の構文は次のとおりです。

int devmap_unload(devmap_cookie_t handle, offset_t offset, size_t len);

devmap_unload() は、handleoffset、および len で指定されるマッピングページのマッピング変換を無効化します。デバイスドライバは、マッピングのこれらのページのマッピング変換を無効化することで、これらのページへのアクセスを横取りするようシステムに指示しています。さらにシステムは次回、devmap_access (9E) エントリポイントを呼び出すことで、これらのマッピングページへのアクセスが発生したことをデバイスドライバに通知する必要があります。

どちらの関数の場合も、要求が影響を与えるのは、offset を含むページの全体、offset + len で示される最後のバイトを含むページの全体、およびその 2 つのページの間にあるすべてのページです。デバイスドライバは、マッピングされるデバイスメモリーの各ページについて、ある任意の時点で有効な変換を持つプロセスは 1 つのみであることを確認する必要があります。

成功時には、どちらの関数からもゼロが返されます。一方、マッピング変換を有効化または無効化するときにエラーが発生した場合、そのエラーがデバイスドライバに返されます。デバイスドライバはこのエラーをシステムに返す必要があります。