メモリーセグメントをエクスポートするとき、アプリケーションはまず、通常のオペレーティングシステムインタフェース (System V Shared Memory Interface、mmap、または valloc など) を使用して、自分の仮想アドレス空間にメモリーを割り当てます。メモリーを割り当てたあと、アプリケーションは RSMAPI ライブラリインタフェースを呼び出し、セグメントを作成して、ラベルを付けます。セグメントにラベルを付けたあと、RSMAPI ライブラリインタフェースは割り当てた仮想アドレスの範囲に物理ページをバインドします。物理ページをバインドしたあと、RSMAPI ライブラリインタフェースはセグメントを発行して、インポートしているプロセス (インポータ) がアクセスできるようにします。
mmap を使用して仮想アドレス空間を取得した場合、マッピングは MAP_PRIVATE である必要があります。
エクスポート側のメモリーセグメント操作には、次のような操作が含まれます。
メモリーセグメントの作成および破壊
メモリーセグメントの発行および発行解除
メモリーセグメント用のバッキングストアの再バインド
rsm_memseg_export_create を使用して新しいメモリーセグメントを確立すると、セグメントを作成するときに物理メモリーを関連付けることができます。この操作は、エクスポート側のメモリーセグメントハンドルを新しいメモリーセグメントに戻します。セグメントは作成するプロセスが動作している間、または、rsm_memseg_export_destroy を使用して破壊するまで存在します。
インポート側が切断する前に破壊操作が行われた場合、切断が強制的に行われます。
この関数はセグメントハンドルを作成します。セグメントハンドルを作成したあと、この関数はセグメントハンドルを指定された仮想アドレス範囲 [vaddr..vaddr+size] にバインドします。この範囲は有効であり、コントローラの alignment プロパティー上に整列している必要があります。flags 引数はビットマスクで、次の操作を有効にします。
セグメント上のバインド解除
セグメント上の再バインド
RSM_ALLOW_REBIND の flags への引き渡し
ロック操作のサポート
RSM_LOCK_OPS の flags への引き渡し
RSM_LOCK_OPS フラグは RSMAPI の初期リリースには含まれません。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
コントローラハンドルが無効です
コントローラが存在しません
セグメントハンドルが無効です
コントローラの長さが 0 あるいは、制限を超えています
アドレスが無効です
Permission denied
メモリーが不足しています
資源が不足しています
アドレスがページ境界に整列されていません
シグナルによって操作が割り込まれました
この関数はセグメントとその空き資源の割り当てを解除します。インポートしているプロセス (インポータ) はすべて強制的に切断されます。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です
pollfd は使用中です
発行操作によって、相互接続上にあるほかのノードがメモリーセグメントをインポートできます。エクスポートセグメントは複数の相互接続アダプタ上で発行できます。
セグメント ID は承認された範囲または 0 を指定した場合、有効なセグメント ID が RSMAPI フレームワークによって生成され、返されます。
セグメントアクセス制御リストはノード ID とアクセス権のペアから構成されます。リストでは、指定したノード ID ごとに、Solaris のファイルアクセス権とともに所有者、グループ、およびその他のユーザーの 3 つの 8 進数によって関連する読み取り権と書き込み権が示されます。アクセス制御リストでは、各 8 進数は次の値を持ちます。
書き込みアクセス。
読み取り専用アクセス。
読み取りおよび書き込みアクセス。
たとえば、0624 というアクセス権は次のことを意味します。
エクスポータと同じ uid を持つインポータは、読み取りと書き込み両方のアクセス権を持つ。
エクスポータと同じ gid を持つインポータは、書き込みアクセス権だけを持つ。
その他すべてのインポータは、読み取り専用アクセス権だけを持つ。
アクセス制御リストが提供される場合、リストに含まれないノードはセグメントをインポートできません。ただし、アクセス制御リストが NULL の場合は、すべてのノードがセグメントをインポートできます。すべてのノードのアクセス権は、エクスポートするプロセス (エクスポータ) の所有者、グループ、およびその他のファイル作成権と同じになります。
ノードアプリケーションはセグメント識別子の割り当てを管理し、エクスポートするノード上で一意性を保証する義務があります。
typedef struct { rsm_node_id_t ae_node; /* remote node id allowed to access resource */ rsm_permission_t ae_permissions; /* mode of access allowed */ } rsmapi_access_entry_t;.
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です
セグメントはすでに発行されています
アクセス制御リストが無効です
セグメント ID が無効です
セグメント ID は使用中です
セグメント ID は予約されています
セグメントの作成者ではありません
アドレスが不正です
メモリーが不足しています
資源が不足しています
認可されたセグメント ID の範囲:
0
0x0FFFFF
0x100000
0x1FFFFF
0x200000
0x2FFFFF
0x300000
0x3FFFFF
0x400000
0x4FFFFF
次に示す範囲は、公開値が 0 の場合、システムによる割り当て用に予約されています。
0x80000000
0xFFFFFFF
この関数は、ノードのアクセス (制御) リストとセグメントのアクセスモードを新たに確立します。これらの変更は将来のインポート呼び出しだけに影響し、すでに許可されているインポート要求は取り消しません。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です
セグメントが発行されていません
アクセス制御リストが無効です
セグメントの作成者ではありません
メモリーが不足しています
資源が不足しています
シグナルによって操作が割り込まれました
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です
セグメントが発行されていません
セグメントの作成者ではありません
シグナルによって操作が割り込まれました
再バインド操作は、エクスポートセグメントの現在のバッキングストアを解放します。現在のバッキングストアを解放したあと、再バインド操作は、新しいバッキングストアを割り当てます。まず始めにアプリケーションは、セグメント用の新しい仮想メモリー割り当てを取得する必要があります。この操作はセグメントのインポータに透過的です。
アプリケーションは、再バインド操作が完了するまで、セグメントデータへアクセスしてはいけません。再バインド中にセグメントからデータを取得しようとしてもシステムエラーにはなりませんが、このような操作の結果は定義されていません。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です
長さが無効です
アドレスが無効です
再バインドは許可されていません
セグメントの作成者ではありません
Permission denied
メモリーが不足しています
資源が不足しています
シグナルによって操作が割り込まれました