本文共 1880 字,大约阅读时间需要 6 分钟。
kmalloc
或类似函数分配物理连续内存(如 tx_buf
和 rx_buf
)。tx_buf
和 rx_buf
)。tx_buf
)和接收缓冲区(rx_buf
)。为了支持用户空间 DMA,需要在内核空间完成以下操作:
uio-dma.c 是由 Max Krasnyansky 编写,用于支持用户空间 DMA 操作。
uio_dma_alloc
:分配 DMA 区域。uio_dma_free
:释放 DMA 区域。uio_dma_map
:将 DMA 区域映射到设备。uio_dma_unmap
:从设备中取消映射 DMA 区域。uio_dma_alloc(fd, size, cache, dma_mask, memnode)
uio_dma_map(fd, area, devid, dir)
uio_dma_unmap(fd, mapping)
struct uio_dma_area *uio_dma_alloc(int fd, unsigned int size, unsigned int cache, uint64_t dma_mask, unsigned int memnode);
参数说明:
fd
:UIO DMA 文件描述符。size
:区域大小。cache
:缓存模式。dma_mask
:DMA 地址掩码。memnode
:内存节点。调用步骤:
UIO_DMA_ALLOC
方法获取区域。int uio_dma_free(int fd, struct uio_dma_area *a);
UIO_DMA_FREE
方法。int uio_dma_map(int fd, struct uio_dma_area *area, uint32_t devid, unsigned int dir);
参数说明:
devid
:UIO DMA 设备 ID。dir
:方向(DMA_TO_DEVICE
或 DMA_FROM_DEVICE
)。调用步骤:
int uio_dma_unmap(int fd, struct uio_dma_mapping *m);