编程接口指南

内存访问元语

以下接口提供了一种机制,用于在 8 位和 64 位数据之间进行传送。get 接口使用重复计数 (rep_cnt) 来表示进程将从连续位置读取的给定大小的数据项数。这些位置从导入的段中的字节偏移 offset 开始。数据会写入从 datap 开始的连续位置。put 接口可使用重复计数 (rep_cnt)。此计数表示进程将从连续位置读取的数据项数。这些位置从 datap 开始。然后,数据会写入已导入段中的连续位置。这些位置从 offset 参数所指定的字节偏移开始。

如果源与目标具有不兼容的字节存储顺序特征,则这些接口还可提供字节交换功能。

函数原型:

int rsm_memseg_import_get8(rsm_memseg_import_handle_t im_memseg, off_t offset, uint8_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_get16(rsm_memseg_import_handle_t im_memseg, off_t offset, uint16_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_get32(rsm_memseg_import_handle_t im_memseg, off_t offset, uint32_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_get64(rsm_memseg_import_handle_t im_memseg, off_t offset, uint64_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_put8(rsm_memseg_import_handle_t im_memseg, off_t offset, uint8_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_put16(rsm_memseg_import_handle_t im_memseg, off_t offset, uint16_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_put32(rsm_memseg_import_handle_t im_memseg, off_t offset, uint32_t *datap, ulong_t rep_cnt);
int rsm_memseg_import_put64(rsm_memseg_import_handle_t im_memseg, off_t offset, uint64_t *datap, ulong_t rep_cnt);

以下接口用于进行规模大于段访问操作所支持范围的数据传送。

放置段

int rsm_memseg_import_put(rsm_memseg_import_handle_t im_memseg, off_t offset, void *src_addr, size_t length);

此函数可用于将数据从 src_addrlength 所指定的本地内存复制到句柄和偏移所指定的对应导入的段所在位置。

获取段

int rsm_memseg_import_get(rsm_memseg_import_handle_t im_memseg, off_t offset, void *dst_addr, size_t length);

此函数类似于 rsm_memseg_import_put(),但是数据从导入的段流入 dest_vec 参数所定义的本地区域。

putget 例程从参数 offset 所指定的字节偏移位置写入或读取指定的数据量。这些例程从段的基地址开始。偏移必须在相应的边界对齐。例如,rsm_memseg_import_get64() 要求 offsetdatap 在双字界对齐,而 rsm_memseg_import_put32() 则要求偏移在单字边界对齐。

缺省情况下,段的屏障 (barrier) 模式属性为 implicit。 隐式屏障 (barrier) 模式表示调用方假设数据传送在从操作返回时已完成或失败。 由于缺省屏障 (barrier) 模式为隐式,因此应用程序必须初始化屏障 (barrier)。使用缺省模式时,应用程序会在调用 putget 例程之前使用 rsm_memseg_import_init_barrier() 函数初始化屏障 (barrier)。要使用显式操作模式,调用方必须使用屏障 (barrier) 操作来强制完成传送。强制完成传送之后,调用方必须确定强制完成是否产生了任何错误。


注 –

通过在 rsm_memseg_import_map() 例程中传递偏移可以部分映射导入段。如果部分映射了导入段,则 putget 例程中的 offset 参数是相对于段的基地址。用户必须确保将正确的字节偏移传递给 putget 例程。


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

RSMERR_BAD_SEG_HNDL

段句柄无效

RSMERR_BAD_ADDR

地址错误

RSMERR_BAD_MEM_ALIGNMENT

内存对齐无效

RSMERR_BAD_OFFSET

偏移无效

RSMERR_BAD_LENGTH

长度无效

RSMERR_PERM_DENIED

权限被拒绝

RSMERR_BARRIER_UNINITIALIZED

未初始化屏障 (barrier)

RSMERR_BARRIER_FAILURE

I/O 完成错误

RSMERR_CONN_ABORTED

连接异常中止

RSMERR_INSUFFICIENT_RESOURCES

资源不足