drm: 特意有和RK原开发者确认过,说是Digital Rights Management, 留给数字版权保护用的,目前没用到,但我的第一想法是Display Rendering Management,是给GPU用的.
cma: Contiguous Memory Allocator, 用于连续物理内存的分配,kernel里最终用dma实现.vmalloc: 物理内存非连续的情况.不过我看了它的allocate实现,最终调用的是alloc_pages(),说明它是物理连续的,这块有待再研究.rk3288_reserve -> rk3288.c rockchip_ion_reserve -> common.c rockchip_ion_find_heap -> rockchip_ion.c //解析dts中配置,主要第二个参数ion_pdata,dts的解析是存到此变量中的. of_get_flat_dt_PRop //获取rockchip,ion_heap 的值,也就是heap id. rockchip_ion_populate_heap //在ion_heap_meta保留了各个heap id对应的type和name, 如果id一样就赋值. of_get_flat_dt_prop //如果有,就读取head的base address和size ion_reserve -> //还是以ion_pdata为参数. 根据heap id或者base=0的分配对应的内存,如果size为0就不分配,这里只有cma的size不是0.另一方面,ion的初始化也会在init中调用ion_init -> rockchip_ion.c platform_driver_register -> rockchip_ion_probe -> device_register -> rockchip_ion_cma_dev此device在上面的rockchip_ion_populate_heap被用到 ion_device_create -> ion.c //创建字符节点,名字是 /dev/ion, 用于上层调用. misc_register //对用fops是ion_fops debugfs_create_file //创建多个调试文件,在/sys/kernel/debug下可以看到 ion_heap_create -> ion_heap.c //根据每个head信息依次创建struct ion_heap,用于管理heap. ion_cma_heap_create //cma类型的heap调用的是此接口. ion_device_add_heap //添加到树中管理.到此,用户空间可以正常的接口操作ion了,现成例子hardware/rockchip/librkvpu/common/vpu_mem_test.cion_mytest1 -> ion_open -> system/core/libion/ion.c open("/dev/ion", O_RDWR); -> ion_open -> ion.c //内核空间 ion_client_create //标准创建client方法 ion_alloc -> //分配内存,会返回一个handle, heap_mask和len是关键参数,决定分配的head type以及size. ion_ioctl(fd, ION_IOC_ALLOC, &data); //本质是调用ioctl ion_ioctl -> //内核空间 ion_alloc -> ion_buffer_create //标准创建ion buffer方法, 前面会判断只有heap id在内核里存在并且一致才可以创建,所以用户空间传参要注意. ion_handle_create //标准创建handle, 系统用handle来管理buffer. ion_handle_add //创建完成后添加. ion_free新闻热点
疑难解答