




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DAVINCIZ路一CMEM模块分析 HYPERLINK mailto:cmem用丁管理一个或者多个连续的物理块内存并提供地址转换(虚拟地址转换到物理地址或物理地址转换到虚拟地址)功能,物理连续地址内存用丁主处理器与DSP(或者协处理器、DMA)的数据BUF共享。在系统启动的时候,av_captui*e_loadsh运彳亍加载cmenikko驱动初始化,注册字符设备CMEM,并传递命令参数到内核,格式如下:Insmodcmemk.kophys_start=0 x83C00000,phys_end=0 x88000000pools=50 x512,2x4096,2x8192,2x16384,1x
2、3276&lx51200,1x102400,1x4096000phys_start、phys_end代表ChlEM的开始和结束物理地址,16进制表示。pools代表分配的内存池,指定了人小和数気如50 x512,表示分配50个512人小的空间,十进制表示。上面SH文件中的命令行创建了8个pools分别是:50buffeisofsize512,2buffeisofsize40962buffetsofsize8192,2buffersofsize16384,1buffersofsize32768,1buffersofsize51200,1buffetsofsize102400,1buffersof
3、size4096000。实际分配是以页为最小单位,人小依赖于平台页的犬小(PAGE_SIZE,一般为4K),如50 x512,实际分配的是50 x4096。因此实际分配的Pools空间人丁等丁命令行请求的人小。CMEM剩余空间用T-Heap的分配。Davinci系统内存可以分成两人类:LINUX系统管理kmalloc获取内核空间内存,malloc获取用户空间内存。CMEM模块管理CMEMalloc获得cmem内存,CMEM_free()释放cmem内存图一通过修改U-BOOT的参数bootargs配置丄inux系统内存人小,剩卜-的内存通过加载;CMEM,用于内核模块CMEM使用。CMEM内存
4、可以分成4种类型:Video/AudiocodecusagememoiyEncodedatacircularbufferCachepoolbufferInput/outputbufferCMEM模块软件结构包括两部分:驱动和封装的中间库。中间库是调用驱动的接II(open、release、mmap、ioctl)实现,用于向应用层提供统一API接11函数。提供的API接II如F:/*InitializetheCMEMmodule.MustbecalledbeforeotherAPIcalls.7intCMEMjnit(void)/FinalizetlieCMEMmodule.7CMEM_exit
5、(void)/*FindthepoolthatbestfitsagivenbuffersizeandhasabufferavailableintCMEM_getPool(sizeJsize)/*Allocatememoiyfi-omaspecifiedpool*/void*CMEMallocPool(intpoolid.CMEM_AllocParamsparams)/*Allocatememoryofaspecifiedsize.*/void*CMEMalloc(sizejsize,CMEM_AlhcParamsparams)/*Freeabufferpreviouslyallocatedwi
6、tliCMEM_alloc()/CMEM_allocPool0.*/intCMEMjis(voidptr.CMEM_Al.locParamsparams)/*Registersharedusageofanalready-allocatedbuffer.*/void*CMEM迄gist岔Alloc(unsignedbngphysp)/*UnregisteruseofabufferpreviouslyregisteredwithCMEMj-egisterAllocO*/intagister(void水ph:CMEM_AllocParamsparams)/*Getthephysicaladdress
7、ofacontiguousbuffer/unsignedlongCMEMPhys(voidptr)以H264编码算法为例,算法内存分配主要用到以下5个API接口函数:CMEMjnit,CMEM_exit,CMEM_alloc,CMEM_free,CMEMgetPhySo1、CMEMmtO源代码:intCMEM_imt(void)intflags;unsignedintversion,广调用了CMEM驱动接口open,open中的具体实现将在CMEM驱动中说I卅/cmem_fd=openC/dev/cmem-,O_RDWR),if(cmem_fd=-1)_E(-imtFailedtoopen/d
8、ev/cniem:%s*nstreiror(ernw),return1,ref_count+;/*版本检査*/version=CMEM_getVersionOif(version&OxffifDOOO)!=(CMEM_VERSION&0 x任ffOOOO)_E(-imt:majorversionmismatchbetweeninterfaceanddrivern)t_E(Bneedsdiiverversion%#x,got%#xnu,CMEM_VERSION,version);CMEM_exitO;return1,)elseif(version&OxOOOOffif)type=CMEM_POO
9、L)returngetAndAllocFromPool(blockid,size,params)/分配Pool空间elsereturnallocFromHeap(blockidsize,params”/分配He却空间)2.1、getAndAllocFromPool()源代码:staticvoid*getAndAllocFromPool(intblockid,sizesize,CMEMAllocParains*parains)intpoolid,/*briefFindthepoolinmemoryblockblockidthatbestfitsagivenbuffersizeandhasabuf
10、feravailable*/.poolid=CMEM_getPool2(blockid,size),if(poolid=-1)returnNULL;广根据poolid,获得pool空间拿/returnallocFromPool(blockid,poolid,params);2.2、allocFromHeap()源代码:staticvoid*allocFromHeap(intblockid,size_tsize,CMEM_AllocParains*parains)void*usei-p,unionCMEM_A11ocUnionallocDesc;unsignedlongphysp,unsigne
11、dintcmd,intrv,cmd=CMEM_IOCALLOCHEAP|parains-flags,allocDesc.alloc_heap_mparams.size=size,allocDesc.alloc_heapjnparains.align=params-alignment=0?1parainsalignment,allocDesc.alloc_heapjnparains.blockid=blockid;rv=ioctl(cmeni_fd,cmd,&allocDesc);if(rv!=0)(_E(-allocHeap:loctl%sfailed:%dncmd=CMEMJOCALLOCH
12、EAP?MEMJOCALLOCHEAPMCMEMJOCALLOCHEAPCACHEDrv);returnNULL,)physp=allocDesc.physp,_D(allocHeapallocatedphysbuffer%xn,physp);/*Mapthephysicaladdresstouserspace*/userp=mmap(0,/Preferredstartaddresssize,/LengthtobemappedPROT_WRITE|PROT_READ,/ReadandwriteaccessMAP_SHARED,/Sharedmemorycmem_fd,/Filedescnpto
13、rphysp);/Thebyteoffsetfromfdif(userp=MAPFAILED)_ECallocHeap:Failedtonimapbufferatphysicaladdress%Sxnu,physp);_E(BFreeingphysbufferphysp);ioctl(cmem_fd,CMEMOCFREEHEAPPHYS,问hysp),returnNULL,_D(allocHeapmmapsucceeded,returningvirtbuffer%pn,userp);returnuserp;上山j的廉API都是基丁驱动CMEM捉供的接口(open、release、mmap、io
14、ctl)实现,以下分析CMEM驱动的各个接口的具体实现。在SH文件av_capture_load.sh运行加载cmemk.ko时,驱动中初始化函数anemjmt()执彳亍。主耍完全字符设备CMEM的注册,根据cmemk.ko传递的参数完成POOLS.Heap的初始化。字符设备提供的文件操作结构描述定义如2staticstructfile_operationscmemfens=ioctl:ioctl,mmap:mmap,open:open,release:release;1、open接LIstaticintopen(structinode*inode,structfile*filp)atomic
15、_inc(&refeience_count),/*原子变t的初始化水/retuiTi0t2、mmap接I丨staticintmmap(structfile水flip,structvm_area_struct*vma)tuisignedlongphysp,structpool_buffer水entry,physp=vma-vm_pgoffPA.GE_SHIFT,if(down_mterruptible(&cmem_mutex)return-ERESTARTSYS,/*looksforanallocatedpoolbufferwithphyisicaladdrphysp*/entiy=find_b
16、usy_entiy(physp,NULL,NULL,NULL),up(&cmem_mutex)if(entry!=NULL)if(entiy-flags&CMEM_CACHED)_DCmmap:callingset_cached(%p)An11,vma),returnset_cached(vma)”else_DCmmap:callingset_noncached(%p).An1,vma),returnset_noncached(vma)”else_Cmmap:cantfindallocatedbufferwithphysp%lxnB,physp),return-EINVAL,3xioctl接【
17、IIoctl支持的命令有CMEM_IOCALLOC、CNIEMJOCALLOCHEAPCMEMJOCFREE.CMEMJOCGETPHYS.CMEM_IOCGETSIZE、CMEMJOCGETPOOLCMEMJOCCACHE.CMEM_IOCGETVERSION、CMEMJOCGETBLOCK.CMEMJOCREGUSER以DM365的H264编码为例,主要用到的IOCTL命令有:CMEMJOCALLOCHEAP,CMEMJOCFREE.CMEM_IOCGETPHYS、CMEM_IOCC血CHE、CN1EM_IOCGETVERSION下面的兀码也仅以使用的IOCTL做为简单说明。一一stati
18、cmtioctl(stnictmode愉ode,structfileunsignedmtcmd,unsignedlongais)unsignedmt_userzlzargp=(unsignedmt_user:l7args;stnicthstjieadzhzfreelistp=NULL;stnicthstjiead本biisylistp=NULL;stnicthstjiead:i:registeredhstp;stnicthstjiead:l:e=NULL;stnicthstjiead%;stnicthstjieadziimext;structpool_biifferzlentiy;struct
19、regisietdjiseriiser;unsignedlongpkysp;unsignedlongviitp,vutp_end;seeJ:reqsce,size,align;intdelta=MAXTYPE(mt);mtpool=-1I,bi,id;structblockjtnictblock;imionCMEM_AllocUnionallocDesc;switch(emd&CMEMJOCCMDMASK)caseCMEMOCALLOCHEAP:/Heap的分配pnntkCCMEMJOCALLOCHEAPnu);if(copyJromjiser(&allocDesc,argp,sizeofia
20、llocDesc)return-EFAULT;size=allocDesc.allocJeapjnparams.size;align=allocDesc.allocJieapjnparams.align;bi=allocDesc.allocJieapjnparatns.blocked;_D(nALLOCHEAP%sloctlreceivedonheappoolforblock%dntf,cmd&CMEMJJACHED?“CACHED”:Ubi);页(bi=NBLOCKS)_E(nioctl:invalidblockid%d,mustbephysp=physp;entjy-kvutp=virtp
21、;entjy-ste=see;entiy-flags=emd&CMEMOCCMDMASK;INIT_LIST中EAD(&entiy-iisers);biisyhstp=&pj)bjsbiheapj?oolbiJ.biisydist;hst_ciddjail(&entiy-element,biisylistp);user=kmcdloc(s匸eqfistructlgisteiedjiser),GFP_KERNEL);tiser-filp=flip;list_cidd(&iiser-element,&entjy-iisers);tip(&cmemjmitex);tf(piitjiser(psp,a
22、jp)return-EFAULT;_D(nALLOCHEAP%s:allocated%#vsizebttfferat(physaddress)nft,and&CMEMCACHED?uCACHED19:tentjysize,entiy-physp);break;/:i:ajpcontainsapointertoanallocdescriptorcomingin,andthe*pricedaddiEssandsizeoftheallocatedbufferwhenreturning汨caseCMEMJOCALLOC:prmtkCCMEMJOCALLOCntf);break;/:i:aipconta
23、inseithertheuservirtualaddressorthep呼sicaladdressofthebiiffertofreecomingm,andcontainsthepoolyvheieitwasfreedfromandthesizeoftheblockoni-etiirn.*1caseCMEMOCFREE:prmtkCCMEMJOCFREEnu);break;/:l:argpcontainstheuservirtualadd沱ssofthebicffertotranslatecomingin,andthetranslatedphysicaladd沱ssonreturn严/case
24、CMEMJOCGETPHYS:prmtk(ftGETPHYSloctlreceived.nu);页(getjiser(vutp,aip)return-EFAULT;physp=get_phys(virtp);if(P呼sp=(0L)_E(nGETPHYS:Failedtoconvertvirtual%#Zxtoph)sical.nu,viitp);return-EFAULT;tf(piitjiser(psp,argp)return-EFAULT;_D(”GETPHYS:itiUTiingphysp);break;/:l:argpcontainsthepooltoqueryforsizecoin
25、ingm,andthesize:l:ofthepooloni-etiirn.7caseCMEMJOCGETSIZE:prmtk(GETSIZEloctliceivedntf);break;严argpcontainstheleqiiestedpoolbuffersizecomingin,andthe定poolid(index)on帧caseCMEMOCGETPOOL:根据请求的poolbufA小,返回poolidprmtk(uGETPOOLloctlleceived.nu);break;caseCMEMOCCACHE:prmtk(9tCACHE%s%sloctlieceived.nu,and&CMEMJVB?WB”:Ucmd&CMEMNV?:ttn);if(copyjromjiser(&bloc匕argp,srzeof(block)return-EFAULT;vutp=block.addr;vutpynd=viitp+block.sne;switch(cmd)caseCMEMOCCACHEWB:VnfdefUSEJJACHEyOIDyiRGdmac_cleanjaange(voidzlz)vntp,(v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 航空材料检测与质量控制补充协议
- 工业废气处理项目验收质量规范完善及补充协议
- 传染性单核细胞增多症指南
- 整体护理查房
- 职场素质培训体系构建
- 公共关系危机管理教学
- 醇在医学领域的应用研究
- 新课改瘦专用2025版高考政治一轮复习第三单元微专题选择题题型专攻四-引文类讲义新人教版必修4
- 过度肥胖患者护理
- 产前护理知识普及与实践
- Q-GDW 1202-2015国家电网公司应急指挥中心建设规范
- GB/T 3953-2024电工圆铜线
- (附加条款版)医院劳务合同书
- 科技想要什么
- 地下车库照明改造方案
- 中考修改病句课件
- 《介绍老舍》课件
- 体育装备科技创新趋势
- 宿舍楼施工安全管理体系与措施
- 预防未成年人犯罪的讲座
- 医疗设备维保服务投标方案
评论
0/150
提交评论