第一章介绍:ION的框架和buffer的分配;
第二章介绍:如何使用ION buffer;
前面一章介绍了ION的整体框架及ION_device,ION_client,ION_heap创建和关系;这章将介绍如使使用操作ION;
(一)ion_alloc
用户层已经通过ion_open创建好了client,这个clinet已经跟ION device绑定,现在可以通过ion_alloc()来申请分配内存:
216 if(ion_alloc(
217 mIonDrv,
218 pInfo->size,
219 0, //32 //alignment
220 ION_HEAP_MULTIMEDIA_MASK,
221 ion_prot_flags,
222 &pIonHandle))
system/core/libion/ion.c:
70 int ion_alloc(int fd, size_t len, size_t align, unsigned int heap_mask,
71 unsigned int flags, ion_user_handle_t *handle)
72 {
73 int ret;
74 struct ion_allocation_data data = {
75 .len = len,
76 .align = align,
77 .heap_id_mask = heap_mask,//指定在那个heap分配;
78 .flags = flags,
79 };
80
81 if (handle == NULL)
82 return -EINVAL;
83
84 ret = ion_ioctl(fd, ION_IOC_ALLOC, &data);
85 if (ret < 0)
86 return ret;
87 *handle = data.handle;//获取到handle之后,返回回去,这个值还不能进程间共享,只能当前进程访问,因为这是一个虚拟地址。
88 return ret;
89 }
调用kernel这边ion device驱动ioctrl()调用ion_alloc()来完成:
450 struct ion_handle *ion_alloc(struct ion_client *client, size_t len,
451 size_t align, unsigned int heap_id_mask,
452 unsigned int flags)
//遍历所有heap找到mask标识的heap,然后通过ion_buffer_create()创建buffer;
488 plist_for_each_entry(heap, &dev->heaps, node) {
489 /* if the caller didn't specify this heap id */
490 if (!((1 << heap->id) & heap_id_mask))
491 continue;
492 buffer = ion_buffer_create(heap, dev, len, align, flags);
493 if (!IS_ERR(buffer))
494 break;
495 }
//ion handle: 这里每个ion handle映射到一个buffer中,每个buffer关联一个heap。也就是说一个客户端可以操作多块buffer。
508 handle = ion_handle_create(client, buffer);
510 /*
511 * ion_buffer_create will create a buffer with a ref_cnt of 1,
512 * and ion_handle_create will take a second reference, drop one here
513 */
514 ion_buffer_put(buffer);
522 ret = ion_handle_add(client, handle);//将创建的ion_handle加入到client的红黑树中;
523 mutex_unlock(&client->lock);
524 if (ret) {
525 ion_handle_put(handle);
526 handle = ERR_PTR(ret);
527 IONMSG("%s ion handle add failed %d.\n", __func__, ret);
528 }
下面看看buffer的创建;
107 static struct ion_buffer *ion_buffer_create(struct ion_heap *heap,
108 str