---
title: 特殊场景1-不支持SVA但是使能IOMMU，所有注册到UACCE框架的设备都是支持PASID和支持IOMMU的场景
description: "为了解决硬件不能访问用户态VA的问题，WD基础层接口新增了内存相关接口，主要有wd_reserve_memory，wd_blkpool_create，wd_blkpool_destroy，wd_alloc_blk和wd_free_blk这几个函数和struct wd_blkpool_setup结构体。其中："
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC1/accel/kunpengaccel_17_0015.html
sourcePath: /source/zh/kunpengboostkithistory/252RC1/accel/kunpengaccel_17_0015.html
indexId: 057e574f0b1f51826e36498a65a12f04cba43f1d58634179cd6f2ae07ad88fa772
---
# 特殊场景1-不支持SVA但是使能IOMMU，所有注册到UACCE框架的设备都是支持PASID和支持IOMMU的场景

为了解决硬件不能访问用户态VA的问题，WD基础层接口新增了内存相关接口，主要有wd_reserve_memory，wd_blkpool_create，wd_blkpool_destroy，wd_alloc_blk和wd_free_blk这几个函数和struct wd_blkpool_setup结构体。其中：

- 内存预留接口：wd_reserve_memory用来申请一片内存，使得硬件和用户态均可使用VA访问这片内存。
- 块模式-内存池预留和释放接口：wd_blkpool_create基于用户定义的块大小和块数量来申请一片内存，使得硬件和用户态均可使用VA访问这片内存。wd_blkpool_destroy销毁wd_blkpool_create创建的内存池。
- 块模式-内存分配释放接口：wd_alloc_blk和wd_free_blk，从wd_blkpool_create申请的内存中，申请一个或者释放一个块大小的内存。

每个函数的具体细节请参考WD数据存储格式与内存接口。

在特殊场景1下，使用WD基础层接口时，在涉及到内存操作时要稍作调整，新增的接口使用中需要考虑的注意事项具体包括：

1. 消息发送前，指针需要传递给硬件的话，在  默认场景
中的第3步之前，声明一个struct wd_blkpool_setup变量，确定使用多大的内存池，这块内存池里面又切分成多少块，每块内存是多大。
  1 2 3 4 5 6 struct wd_blkpool_setup { __u32 block_size;/* Block buffer size */ __u32 block_num;/* Block buffer number */ __u32 align_size;/* Block buffer startging address align size */ struct wd_mm_br br;/* memory from user if don't use WD memory */ };

2. 消息发送前，指针需要传递给硬件的话，取struct wd_blkpool_setup变量地址作为参数调用void *wd_blkpool_create(struct wd_queue *q, struct wd_blkpool_setup *setup)接口预留出相应大小的内存，如果成功则返回内存池起始地址，失败则返回空指针。函数内部会调用wd_reserve_memory来预留内存。
3. 消息发送前，指针需要传递给硬件的话，在  默认场景
中的第3步中，涉及到需要传给硬件的地址，都通过wd_alloc_blk从预留的内存池中分配出来。
4. 消息接收处理完后，在  默认场景
中的第7步中，释放通过wd_alloc_blk申请的内存时，使用wd_free_blk释放。
5. 消息接收处理完后，在  默认场景
中的第7步后，把预留内存池起始地址作为参数，调用wd_blkpool_destroy释放预留的内存。
