本文共 1876 字,大约阅读时间需要 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);