DAVINCI 之路—CMEM 模块分析
--- liangxing031@163.com
cmem 用于管理一个或者多个连续的物理块内存并提供地址转换(虚拟地址转换到物理
地址或物理地址转换到虚拟地址)功能,物理连续地址内存用于主处理器与 DSP(或者协
处理器、DMA)的数据 BUF 共享。
在系统启动的时候,av_capture_load.sh 运行加载 cmemk.ko 驱动初始化,注册字符设备
CMEM,并传递命令参数到内核,格式如下:
Insmod cmemk.ko phys_start=0x83C00000,phys_end=0x88000000
pools=50x512,2x4096,2x8192,2x16384,1x32768,1x51200,1x102400,1x4096000
phys_start、phys_end 代表 CMEM 的开始和结束物理地址,16 进制表示。
pools 代表分配的内存池,指定了大小和数量,如 50x512,表示分配 50 个 512 大小的空间,
十进制表示。
上面 SH 文件中的命令行创建了 8 个 pools,分别是:50 buffers of size 512,2 buffers of size
4096,2 buffers of size 8192,2 buffers of size 16384,1 buffers of size 32768,1 buffers of size
51200,1 buffers of size 102400,1 buffers of size 4096000。实际分配是以页为最小单位,大
小依赖于平台页的大小(PAGE_SIZE,一般为 4K),如 50x512,实际分配的是 50x4096。
因此,实际分配的 Pools 空间大于等于命令行请求的大小。CMEM 剩余空间用于 Heap 的分
配。
Davinci 系统内存可以分成两大类:
LINUX 系统管理——kmalloc 获取内核空间内存,malloc 获取用户空间内存。
CMEM模块管理——CMEM_alloc获得cmem内存,CMEM_free()释放cmem内存
评论1