kupl_mem_copyin
内存拷贝,将内存从 ddr 拷贝至 hbw
接口定义
int kupl_mem_copyin(void *ddr_addr, size_t size, kupl_mem_copyin_flag_t flag, kupl_queue_h queue);
参数
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
ddr_addr |
void * |
需要拷贝的 ddr 地址 |
输入 |
size |
size_t |
需要拷贝的内存字节大小 |
输入 |
flag |
kupl_mem_copyin_flag_t |
进行换入操作的类型,包括: KUPL_MEM_CREATE 如果ddr_addr 不是 present 状态则创建 ddr 至 hbw 的映射(此时状态变成 present),否则引用计数加一 KUPL_MEM_IN 如果ddr_addr 不是 present 状态则创建 ddr 至 hbw 的映射,并将 ddr 上的内容拷贝至 hbw(此时状态变成 present),否则引用计数加一 KUPL_MEM_PUSH 将 ddr 上的内容拷贝至 hbw |
输入 |
queue |
kupl_queue_h |
进行操作的队列 |
输入 |
返回值
- 成功:返回 KUPL_OK
- 失败:返回 KUPL_ERROR
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include "kupl.h" #include <cassert> static int a = 1; void query_and_modify(void *args) { void *hbw = kupl_mem_query(&a); int ret = kupl_hbw_verify(hbw, sizeof(int), 0); *(int *)hbw = 2; } int main() { auto queue = kupl_queue_acquire(1); kupl_mem_copyin(&a, sizeof(int), KUPL_MEM_IN, queue); auto present = kupl_mem_is_present(&a); assert(present == true); kupl_queue_item_desc_t desc { .field_mask = KUPL_QUEUE_ITEM_DESC_FIELD_NAME, .func = query_and_modify, .args = nullptr, .name = "query_and_modify", }; kupl_queue_submit(queue, &desc); kupl_mem_copyout(&a, sizeof(int), KUPL_MEM_OUT, queue); kupl_queue_wait(queue); present = kupl_mem_is_present(&a); assert(present == false); printf("a: %d\n", a); } |
运行结果如下。
a: 2
- 上述示例演示了 ddr 内存和 hbw 内存完整的换入换出流程。首先使用 kupl_mem_copyin 将内存从 ddr 拷贝至 hbw,然后使用 kupl_mem_is_present 判断内存的可访问性,接着提交一个异步任务使用 kupl_mem_query 查询 ddr 对应的 hbw 的地址然后修改,最后使用 kupl_mem_copyout 将 hbw 上的地址再拷贝回 ddr。
父主题: 内存管理函数