メモリーセグメントをエクスポートするとき、アプリケーションはまず、通常のオペレーティングシステムインタフェース (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 あるいは、制限を超えています。
アドレスが無効です。
アクセス権がありません。
メモリーが不足しています。
リソースが不足しています。
アドレスがページ境界に整列されていません。
シグナルによって操作が割り込まれました。
この関数はセグメントとその空きリソースの割り当てを解除します。インポートしているプロセス (インポータ) はすべて強制的に切断されます。
戻り値: 成功した場合、0 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です。
pollfd は使用中です。
発行操作によって、相互接続上にあるほかのノードがメモリーセグメントをインポートできます。エクスポートセグメントは複数の相互接続アダプタ上で発行できます。
セグメント ID は承認された範囲または 0 を指定した場合、有効なセグメント ID が RSMAPI フレームワークによって生成され、返されます。
セグメントアクセス制御リストはノード ID とアクセス権のペアから構成されます。リストでは、指定したノード ID ごとに、Solaris のファイルアクセス権とともに所有者、グループ、およびその他のユーザーの 3 つの 8 進数によって関連する読み取り権と書き込み権が示されます。アクセス制御リストでは、各 8 進数は次の値を持ちます。
書き込みアクセス
読み取り専用アクセス
読み取りおよび書き込みアクセス
たとえば、0624 というアクセス権は次のことを意味します。
エクスポータと同じ uid を持つインポータは、読み取りと書き込み両方のアクセス権を持つ
エクスポータと同じ gid を持つインポータは、書き込みアクセス権だけを持つ
その他すべてのインポータは、読み取り専用アクセス権だけを持つ
アクセス制御リストが提供される場合、リストに含まれないノードはセグメントをインポートできません。ただし、アクセス制御リストが NULL の場合は、すべてのノードがセグメントをインポートできます。すべてのノードのアクセス権は、エクスポートするプロセス (エクスポータ) の所有者、グループ、およびその他のファイル作成権と同じになります。
ノードアプリケーションはセグメント識別子の割り当てを管理し、エクスポートするノード上で一意性を保証する義務があります。
typedef struct { rsm_node_id_t ae_node; /* 資源へのアクセスを許可されたリモートノード ID */ rsm_permission_t ae_permissions; /* 許可されたアクセスモード */ }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 を返します。そうでない場合、エラー値を返します。
セグメントハンドルが無効です。
長さが無効です。
アドレスが無効です。
再バインドは許可されていません。
セグメントの作成者ではありません。
アクセス権がありません。
メモリーが不足しています。
リソースが不足しています。
シグナルによって操作が割り込まれました。