背景
在驱动的开发过程中,一般来说会涉及两部分的内存:
- 描述符内存,数据量小,但是会比较频繁的跟CPU进行交互
- 数据内存,数据量大,跟CPU交互的一次较少;
在一般芯片架构设计以及软件设计上,对两者经常会有些特别不一样的处理,比如对于描述符的内存,是否需要IO去识别,并且主动推送到CPU cache中? 又或者,对于数据内存,是否需要IO标记不冲刷系统SLC?等等,这里根据业务场景,行为模式的不同,会有一些区分;
同时,对于两块内存的申请,内核也会有特别的内存接口申请方式,一般来说,在内核驱动中,针对描述符内存,一般使用dma_alloc_coherent/dma_alloc_noncoherent接口,并且实际上,目前linux内核驱动,默认使用coherent接口,没有对描述符内存允许软件可配使用noncoherent接口;在处理数据内存的时候,一般使用dma_map_single/dma_pool的方式申请,并且可以选择由硬件维护一致性或者软件维护一致性;