devmap(9E) エントリポイントは、segmap(9E) エントリポイントの内側にある ddi_devmap_segmap(9F) 関数から呼び出されます。
devmap(9E) エントリポイントは、mmap(2) システムコールの結果として呼び出されます。devmap(9E) 関数は、デバイスメモリーまたはカーネルメモリーをユーザーアプリケーションにエクスポートするために呼び出されます。devmap() 関数は次の操作のために使用されます。
デバイスメモリーまたはカーネルメモリーへのユーザーマッピングが妥当かどうか検査する
アプリケーションマッピング内の論理オフセットをデバイスメモリーまたはカーネルメモリー内の対応するオフセットに変換する
マッピング情報をシステムに渡し、マッピングを設定できるようにする
devmap() 関数の構文は次のとおりです。
int devmap(dev_t dev, devmap_cookie_t handle, offset_t off, size_t len, size_t *maplen, uint_t model);
ここでは:
マップするメモリーを含むデバイス。
システムがデバイス内またはカーネル内の連続するメモリーへのマッピングを記述するために作成して使用するデバイスマッピングハンドル。
アプリケーションマッピング内の論理オフセット。ドライバはこのオフセットを、デバイスメモリーまたはカーネルメモリー内の対応するオフセットに変換する必要があります。
マップするメモリーの長さ (バイト)。
ドライバが、異なるカーネルメモリー領域または物理的に不連続な複数のメモリー領域を、連続する 1 つのユーザーアプリケーションマッピングに関連付けることを可能にします。
現在のスレッドのデータモデルタイプ。
システムは、1 つの mmap (2) システムコールで複数のマッピングハンドルを作成します。たとえば、マッピングには、物理的に不連続なメモリー領域が複数含まれる可能性があります。
最初、パラメータ off と len を指定して devmap(9E) が呼び出されます。これらのパラメータは、アプリケーションから mmap(2) に渡されます。devmap(9E) は、*maplen を、off から連続するメモリー領域の末尾までの長さに設定します。*maplen の値は、ページサイズの倍数に切り上げる必要があります。 *maplen の値は、元のマッピング長 len よりも小さい値に設定してもかまいません。そうした場合、システムは、新しいマッピングハンドルと調整後の off および len パラメータを使用しながら、最初のマッピング長に達するまで devmap (9E) を繰り返し呼び出します。
ドライバが複数のアプリケーションデータモデルをサポートする場合は、ddi_model_convert_from(9F) に model を渡す必要があります。ddi_model_convert_from() 関数は、現在のスレッドとデバイスドライバとの間にデータモデルの不一致が存在しているかどうかを判定します。ユーザースレッドが異なるデータモデルをサポートしている場合、デバイスドライバは、データ構造体の構造を調整したあとでその構造体をユーザースレッドにエクスポートしなければならない可能性があります。詳細については、Appendix C, Making a Device Driver 64-Bit Readyのページを参照してください。
devmap(9E) エントリポイントは、論理オフセット off がドライバからエクスポートされるメモリーの範囲外である場合には -1 を返す必要があります。