ION框架学习(一)

第一章介绍:ION的框架和buffer的分配;
第二章介绍:如何使用ION buffer;

  ION是google在Android4.0 为了解决内存碎片管理而引入的通用内存管理器,用来支持不同的内存分配机制,如CARVOUT(PMEM),物理连续内存(kmalloc), 虚拟地址连续但物理不连续内存(vmalloc), IOMMU等


(一)ION 概括

  Heap: 用来表示内存分配的相关信息,包括id, type, name等。用struct ion_heap表示。

  Client: Ion的使用者,用户空间和内核控件要使用ION的buffer,必须先创建一个client,一个client可以有多个buffer,用struct ion_buffer表示。

  Handle: 将buffer该抽象出来,可以认为ION用handle来管理buffer,一般用户直接拿到的是handle,而不是buffer。 用struct ion_handle表示。

  下面是整个框架的类图:

这里写图片描述

说明如下:

  1. 在driver初始化过程中会创建ion_device,并提供给用户层ioctrl接口;不同平台根据定义好的platform data heap类型创建heap,同时指定这写heap操作使用的方法接口;不同类型的heap连接成链表,保存在通过plist_head heap;

  2. 需要使用heap,先注册client,不同的heap有多个client来使用,连接成链表保存在rb_root client;不同的client跟不同的进程pid绑定;

  3. ion_handle管理实际ion_buffer, 成员id:唯一表示ion_buffer的整型变量,通过内核的idr机制加上这个id就可以在其它进程中访问到这块buffer。而且上层在传下来的struct ion_allocation_data结构体中也只是保存了这个id。


  用户空间和内核空间都可以成为client,不过创建的方法稍稍有点区别;

  1. 内核空间:先创建client,有了client之后就可以分配内存,有了handle也就是buffer之后就准备使用了,不过还是物理地址,需要map:

  2. 用户空间:用户空间如果想使用ION,也必须先要创建client,不过它是打开/dev/ion,实际上它最终也会调用ion_client_create。不过和内核空间创建client的一点区别是,用户空间不能选择heap type(使用预订的heap id隐含heap type),但是内核空间却可以。另外,用户空间是通过IOCTL来分配内存的,cmd为ION_IOC_ALLOC.

    ion_fd = open("/dev/ion", O_ RDONLY | O_SYNC);   
    ioctl(ion_fd, ION_IOC_ALLOC, alloc);  

  分配好了buffer之后,如果用户空间想使用buffer,先需要mmap. ION是通过先调用IOCTL中的ION_IOC_SHARE/ION_IOC_MAP来得到可以mmap的fd,然后再执行mmap得到buffer address.然后你也可以将此fd传给另一个进程,如通过binder传递。在另一个进程中通过ION_IOC_IMPORT这个IOCTL来得到这块共享buffer了。


(二)ION Device和Heap创建

  通过ION device和driver匹配之后走入ion_drv_probe()函数:

kernel-4.4/drivers/staging/android/ion/mtk/ion_drv.c

686 static int ion_drv_probe(struct platform_device *pdev)
        //创建ion device,name为ion,并提供应用层操作接口ion_fops;创建调试节点:/sys/kernel/debug/ion
693     g_ion_device = ion_device_create(ion_custom_ioctl);
       //ion_custom_ioctl soc自定义的ioctl操作;
698 
699     /* create the heaps as specified in the board file */
700     for (i = 0; i < num_heaps; i++) {
701         struct ion_platform_heap *heap_data = &pdata->heaps[i];
702         struct ion_heap *heap;
703 
704         if (heap_data->type == ION_HEAP_TYPE_CARVEOUT && heap_data->base == 0) {
705             /* reserve for carveout heap failed */
706             heap_data->size = 0;
707             continue;
708         }
709 
710         heap = ion_mtk_heap_create(heap_data);
714 
715         ion_device_add_heap(g_ion_device, heap);
716     }

  这个函数首先创建一个设备ion_device,通过ion_device_create()来创建,传入一个给到用户层面用的ioctl函数:

539 static long _ion_ioctl(struct ion_client *client, unsigned int cmd,
540                unsigned long arg, int from_kernel) {
541     long ret = 0;
542 
543     ION_FUNC_ENTER;
544     switch (cmd) {
545     case ION_CMD_SYSTEM:
546         ret = ion_sys_ioctl(client, cmd, arg, from_kernel);
547         break;
548     case ION_CMD_MULTIMEDIA:
549         ret = ion_mm_ioctl(client, cmd, arg, from_kernel);
550         break
  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值