dmabuf = ion_alloc_dmabuf(len, heap_id_mask, flags); if (IS_ERR(dmabuf)) { return PTR_ERR(dmabuf); } fd = dma_buf_fd(dmabuf, O_CLOEXEC); if (fd < 0) dma_buf_put(dmabuf); return fd; } 首先是产生产生了一个dma_buf 然后将这个dma-buf 转换成fd。dma-buf 定义位于kernel\ms...
ION_IOC_ALLOC: 分配内存ion_alloc,最终会调用具体heap的alloc函数 ION_IOC_FREE:ion_free 释放内存 ION_IOC_MAP/ION_IOC_SHARE: ion_share_dma_buf_fd创建文件描述符来实现mmap和共享内存 ION_IOC_IMPORT: ion_import_dma_buf通过fd来获取对应的buffer ION_IOC_CUSTOM: 调用用户自定义的ioctl 这里需要关注ION...
kernel ioctl中的ion_alloc_fd 区分与libion中的ion_alloc_fd int ion_alloc_fd(size_t len, unsigned int heap_id_mask, unsigned int flags) { int fd; struct dma_buf *dmabuf; dmabuf = ion_alloc_dmabuf(len, heap_id_mask, flags); if (IS_ERR(dmabuf)) return PTR_ERR(dmabuf); fd =...
fd =ion_alloc(mIonClient, size,0, ION_HEAP_SYSTEM_MASK, ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC | ION_FLAG_PRESERVE_KMAP); } } }else{ fd =ion_alloc(mIonClient, size,0, ION_HEAP_SYSTEM_MASK, ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC | ION_FLAG_PRESERVE_KMAP); ALOGD("...
ion_alloc函数: 从ion dev设备中查找用户想从哪个heap中分配内存 分配成功后,将ion_buffer转换并导出成dma_buf,再讲dma_buf转换成文件fd intion_alloc(size_tlen, unsignedintheap_id_mask, unsignedintflags) {struction_device *dev = internal_dev;struction_buffer *buffer = NULL;struction_heap *heap; ...
具体分配函数为ion_alloc: 共享分配得到的内存buffer: 其中ion_fd_data定义如下: 四、ION内核实现 4.1 关键数据结构 ion_device将会持有一个clients的红黑树,对所有的通过open进来的client,为file设置私有数据为client。一个buffers红黑树,用于全局控制ion_buffer。一个ion_heap红黑树,用于管理所有类型ion_heap。ion_...
int ioctl(int client_fd, ION_IOC_ALLOC, struct ion_allocation_data *allocation_data) This call returns a buffer represented byion_handlewhich is not a CPU-accessible buffer pointer. The handle can only be used to obtain a file descriptor for buffer sharing as follows: ...
ioctl(fd, ION_IOC_ALLOC, alloc_data) //分配内存 ioctl(fd, ION_IOC_MAP/ION_IOC_SHARE, fd_data) //把buff映射为文件 mmap(fd_data.fd) // 将映射为文件的buffer,映射为内存地址 使用unix domain socket + sendmsg 实现分享文件描述符(文件描述符为进程私有),然后接收端映射为虚拟地址操作。
首先介绍dma_buf的2个角色,importer和exporter。importer是dma_buf驱动中的图元消费者,exporter是dma_buf驱动中的图元生产者。 这里借用大佬的图片: dma_buf.png ion是基于dma_buf设计完成的。经过阅读源码,其实不少思路和Android的匿名内存有点相似。阅读本文之前就算不知道dma_buf的设计思想也没关系,我不会仔细到每...
Buffer SynchronizationION considers buffer synchronization to be an orthogonal problem.DMABUF provides a pair of APIs for synchronization. The buffer-user callsdma_buf_map_attachment()whenever it wants to use the buffer for DMA . Once the DMA for the current buffer-user is over, it...