开发者
资源
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

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);

参数

表1 参数定义

参数名

类型

描述

输入/输出

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。