编程接口指南

导出端内存段操作

导出内存段时,应用程序首先通过常规操作系统接口(如 System V 共享内存接口、mmapvalloc)来分配其虚拟地址空间中的内存。分配内存之后,应用程序将调用 RSMAPI 库接口来创建和标记段。标记段之后,RSMAPI 库接口将物理页绑定到已分配的虚拟范围。绑定物理页之后,RSMAPI 库接口会发布段以供导入进程访问。


注 –

如果虚拟地址空间是使用 mmap 获取的,则映射必须为 MAP_PRIVATE


导出端内存段操作包括:

创建和销毁内存段

使用 rsm_memseg_export_create 建立新内存段可以在创建时将物理内存与该段进行关联。此操作将返回新内存段的导出端内存段句柄。段在创建进程的生命周期内一直存在,或者在使用 rsm_memseg_export_destroy 销毁该段之前一直存在。


注 –

如果在导入端断开连接之前执行销毁操作,则会强制断开连接。


创建段

int rsm_memseg_export_create(rsmapi_controller_handle_t controller, rsm_memseg_export_handle_t *memseg, void *vaddr, size_t size, uint_t flags);

此函数可用于创建段句柄。创建段句柄之后,段句柄会绑定到指定的虚拟地址范围 [vaddr..vaddr+size]。此范围必须有效并基于控制器的 alignment 属性对齐。flags 参数是位掩码,可用于执行以下操作:


注 –

RSMAPI 的初始发行版中不包括 RSM_LOCK_OPS 标志。


返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_CTLR_HNDL

控制器句柄无效

RSMERR_CTLR_NOT_PRESENT

控制器不存在

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_BAD_LENGTH

长度为零或长度超出控制器限制

RSMERR_BAD_ADDR

地址无效

RSMERR_PERM_DENIED

权限被拒绝

RSMERR_INSUFFICIENT_MEM

内存不足

RSMERR_INSUFFICIENT_RESOURCES

资源不足

RSMERR_BAD_MEM_ALIGNMENT

地址未在页边界上对齐

RSMERR_INTERRUPTED

操作被信号中断

销毁段

int rsm_memseg_export_destroy(rsm_memseg_export_handle_t memseg);

此函数可用于解除分配段及其可用资源。将强制断开与所有导入进程的连接。

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_POLLFD_IN_USE

pollfd 正在使用

发布、重新发布和取消发布内存段

通过发布操作,其他互连节点可以导入内存段。一个导出段可能会在多个互连适配器上发布。

段 ID 可以在授权范围内指定或指定为零,此时 RSMAPI 框架会生成有效的段 ID 并传递回该段 ID。

段访问控制列表由多对节点 ID 和访问权限组成。对于列表中指定的每个节点 ID,关联的读/写权限会通过三个八进制数字提供给属主、组和其他用户,这与 Solaris 文件权限一样。在访问控制列表中,每个八进制数字都可以具有以下值:

2

写入访问。

4

只读访问。

6

读写访问。

访问权限值 0624 可指定以下访问类型:

提供访问控制列表之后,未包含在此列表中的节点不能导入段。但是,如果访问列表为空,则任何节点都可导入段。所有节点的访问权限等同于导出进程的属主/组/其他用户文件创建权限。


注 –

节点应用程序负责管理段标识符的指定,从而确保导出节点的唯一性。


发布段

int rsm_memseg_export_publish(rsm_memseg_export_handle_t memseg, rsm_memseg_id_t *segment_id, rsmapi_access_entry_t ACCESS_list[], uint_t access_list_length);
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。否则返回错误值。

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_SEG_ALREADY_PUBLISHED

段已发布

RSMERR_BAD_ACL

访问控制列表无效

RSMERR_BAD_SEGID

段标识符无效

RSMERR_SEGID_IN_USE

段标识符正在使用

RSMERR_RESERVED_SEGID

段标识符已保留

RSMERR_NOT_CREATOR

不是段的创建者

RSMERR_BAD_ADDR

地址错误

RSMERR_INSUFFICIENT_MEM

内存不足

RSMERR_INSUFFICIENT_RESOURCES

资源不足

授权的段 ID 范围:

#define RSM_DRIVER_PRIVATE_ID_BASE

0

#define RSM_DRIVER_PRIVATE_ID_END

0x0FFFFF

#define RSM_CLUSTER_TRANSPORT_ID_BASE

0x100000

#define RSM_CLUSTER_TRANSPORT_ID_END

0x1FFFFF

#define RSM_RSMLIB_ID_BASE

0x200000

#define RSM_RSMLIB_ID_END

0x2FFFFF

#define RSM_DLPI_ID_BASE

0x300000

#define RSM_DLPI_ID_END

0x3FFFFF

#define RSM_HPC_ID_BASE

0x400000

#define RSM_HPC_ID_END

0x4FFFFF

以下范围会保留,以便在发布值为零时由系统进行分配。

#define RSM_USER_APP_ID_BASE

0x80000000

#define RSM_USER_APP_ID_END

0xFFFFFFF

重新发布段

int rsm_memseg_export_republish(rsm_memseg_export_handle_t memseg, rsmapi_access_entry_t access_list[], uint_t access_list_length);

此函数可用于建立新的节点访问列表和段访问模式。这些更改仅会影响将来的导入调用,并且不会撤消已准许的导入请求。

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_SEG_NOT_PUBLISHED

段未发布

RSMERR_BAD_ACL

访问控制列表无效

RSMERR_NOT_CREATOR

不是段的创建者

RSMERR_INSUFFICIENT_MEMF

内存不足

RSMERR_INSUFFICIENT_RESOURCES

资源不足

RSMERR_INTERRUPTED

操作被信号中断

取消发布段

int rsm_memseg_export_unpublish(rsm_memseg_export_handle_t memseg);

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_SEG_NOT_PUBLISHED

段未发布

RSMERR_NOT_CREATOR

不是段的创建者

RSMERR_INTERRUPTED

操作被信号中断

重新绑定内存段

重新绑定操作可释放导出段的当前后备存储。释放导出段的当前后备存储之后,重新绑定操作将分配新的后备存储。应用程序必须首先获取分配给段的新虚拟内存。此操作对于段的导入者是透明的。


注 –

应用程序负责防止在重新绑定操作完成之前对段数据进行访问。重新绑定过程中从段中检索数据不会导致系统故障,但执行此类操作的结果是不确定的。


重新绑定段

int rsm_memseg_export_rebind(rsm_memseg_export_handle_t memseg, void *vaddr, offset_t off, size_t size);

返回值:如果成功,则返回 0。否则返回错误值。

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_BAD_LENGTH

长度无效

RSMERR_BAD_ADDR

地址无效

RSMERR_REBIND_NOT_ALLOWED

不允许重新绑定

RSMERR_NOT_CREATOR

不是段的创建者

RSMERR_PERM_DENIED

权限被拒绝

RSMERR_INSUFFICIENT_MEM

内存不足

RSMERR_INSUFFICIENT_RESOURCES

资源不足

RSMERR_INTERRUPTED

操作被信号中断