---
title: kupl_mem_copyout
description: "内存拷贝，将内存从 hbw 拷贝至 ddr"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_238.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_238.html
indexId: f8f2bbfcb3357d0ba9c7e94a50e9e309c32e583f1fd5e74be7180dc95d6a0bb867
---
# kupl_mem_copyout

内存拷贝，将内存从 hbw 拷贝至 ddr

#### 接口定义

int kupl_mem_copyout(void *ddr_addr, size_t size, kupl_mem_copyout_flag_t flag, kupl_queue_h queue);


#### 参数


**表1 参数定义**

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| ddr\_addr | void \* | 需要拷贝的 ddr 地址 | 输入 |
| size | size\_t | 需要拷贝的内存字节大小 | 输入 |
| flag | kupl\_mem\_copyout\_flag\_t | 进行换入操作的类型，包括： KUPL\_MEM\_DELETE 如果ddr\_addr 是 present 状态则引用计数减一，当引用计数归 0 则销毁 ddr 至 hbw 的映射（此时状态变成非 present） KUPL\_MEM\_OUT 如果ddr\_addr 是 present 状态则引用计数减一，当引用计数归 0 则将内存从 hbw 拷贝至 ddr，销毁 ddr 至 hbw 的映射（此时状态变成非 present）KUPL\_MEM\_PULL 将 hbw上的内容拷贝至 ddr KUPL\_MEM\_DELETE\_FINALIZE 销毁映射KUPL\_MEM\_OUT\_FINALIZE 将内存从 hbw 拷贝至 ddr，并销毁映射 | 输入 |
| queue | kupl\_queue\_h | 进行操作的队列 | 输入 |


#### 返回值

- 成功：返回 KUPL_OK
- 失败：返回 KUPL_ERROR


#### 示例

```
#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。
