导出内存段时,应用程序首先通过常规操作系统接口(如 System V 共享内存接口、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
RSMAPI 的初始发行版中不包括 RSM_LOCK_OPS 标志。
返回值:如果成功,则返回 0。否则返回错误值。
控制器句柄无效
控制器不存在
段句柄无效
长度为零或长度超出控制器限制
地址无效
权限被拒绝
内存不足
资源不足
地址未在页边界上对齐
操作被信号中断
此函数可用于解除分配段及其可用资源。将强制断开与所有导入进程的连接。
返回值:如果成功,则返回 0。否则返回错误值。
段句柄无效
pollfd 正在使用
通过发布操作,其他互连节点可以导入内存段。一个导出段可能会在多个互连适配器上发布。
段 ID 可以在授权范围内指定或指定为零,此时 RSMAPI 框架会生成有效的段 ID 并传递回该段 ID。
段访问控制列表由多对节点 ID 和访问权限组成。对于列表中指定的每个节点 ID,关联的读/写权限会通过三个八进制数字提供给属主、组和其他用户,这与 Solaris 文件权限一样。在访问控制列表中,每个八进制数字都可以具有以下值:
写入访问。
只读访问。
读写访问。
访问权限值 0624 可指定以下访问类型:
与导出者具有相同 uid 的导入者具有读写访问权限。
与导出者具有相同 gid 的导入者仅有写入访问权限。
所有其他导入者仅有读取访问权限。
提供访问控制列表之后,未包含在此列表中的节点不能导入段。但是,如果访问列表为空,则任何节点都可导入段。所有节点的访问权限等同于导出进程的属主/组/其他用户文件创建权限。
节点应用程序负责管理段标识符的指定,从而确保导出节点的唯一性。
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 范围:
0
0x0FFFFF
0x100000
0x1FFFFF
0x200000
0x2FFFFF
0x300000
0x3FFFFF
0x400000
0x4FFFFF
以下范围会保留,以便在发布值为零时由系统进行分配。
0x80000000
0xFFFFFFF
此函数可用于建立新的节点访问列表和段访问模式。这些更改仅会影响将来的导入调用,并且不会撤消已准许的导入请求。
返回值:如果成功,则返回 0。否则返回错误值。
段句柄无效
段未发布
访问控制列表无效
不是段的创建者
内存不足
资源不足
操作被信号中断
返回值:如果成功,则返回 0。否则返回错误值。
段句柄无效
段未发布
不是段的创建者
操作被信号中断
重新绑定操作可释放导出段的当前后备存储。释放导出段的当前后备存储之后,重新绑定操作将分配新的后备存储。应用程序必须首先获取分配给段的新虚拟内存。此操作对于段的导入者是透明的。
应用程序负责防止在重新绑定操作完成之前对段数据进行访问。重新绑定过程中从段中检索数据不会导致系统故障,但执行此类操作的结果是不确定的。
返回值:如果成功,则返回 0。否则返回错误值。
段句柄无效
长度无效
地址无效
不允许重新绑定
不是段的创建者
权限被拒绝
内存不足
资源不足
操作被信号中断