ION框架学习(二)

本文深入探讨ION框架,讲解如何使用ION分配内存、共享buffer。通过ion_alloc申请内存,ion_share实现进程间共享,ion_mmap进行映射,ion_import导入buffer,详细阐述了ION在驱动和用户空间的交互过程。
摘要由CSDN通过智能技术生成

  第一章介绍: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
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值