- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
提升LTE基站处理效率
3. 基于Pktlib的层2内存管理
层2是一个基于包处理的模块,在处理中需要临时申请大量的内存,内存管理的效率是影响层2处理性能的关键因素。传统的层2处理一般直接采用操作系统的内存管理模块,完全通过软件来管理内存,这种处理方法在软件处理和加速器处理接口的地方必须做一次数据拷贝,把加速器处理完的数据从加速器的缓存区中拷贝到软件的缓存中。这种拷贝在大量的包处理中极大地影响了效率。同时传统的内存管理方法因为无法通过软件直接保证多核互斥,在多核共享内存的管理上效率很低。
基于Pktlib的内存管理能解决传统内存管理的问题。以LTE下行处理为例,在Keystone上PDCP层的空口安全保护在安全加速器(SA)中完成,其后需要用软件完成RLC和MAC层的处理,然后将处理完的包交给物理层进行编码。层2和物理层的接口根据芯片功能划分有两种选择:物理层可以在其他芯片上完成(这时需要将层2处理完的数据打包通过以太网或SRIO 发送出去),也可以在本芯片上完成(这时可以将层2处理完的数据直接发送给物理层的加速器BCP)。层2软件和SA,BCP,SRIO,EMAC这些加速器或外设的接口都符合QMSS的包格式,并可以通过硬件队列来完成数据的传输。
图3画出了一个基于Pktlib的层2下行的内存管理架构。它的基本思想是在创建堆的时候将通过操作系统申请的固定长度的内存块直接挂接到PD上,然后压入专用的硬件队列(图2的Mem FreeQ),这个硬件队列就相当于一个堆。应用在初始化完Pktlib的Mem FreeQ以后,通过调用Pktlib_allocPacket函数从堆上申请(出队)内存包并将它压入SA的接收空闲队列(Rx FreeQ)。当SA处理完一个PDCP包的空口加密工作后会把数据通过接收侧包DMA(Rx Pkt DMA)写入Rx FreeQ中包指向的内存,然后将包从Rx FreeQ出队,压入接收队列(RxQ)。RLC和MAC层软件接收到调度器的调度请求后,从SA的RxQ出队对应的包并进行RLC和MAC的组包工作。在这个处理过程中,因为涉及到包的分割,合并,添加包头的工作,RLC和MAC模块会动态地申请新的内存,这时同样通过调用Pktlib_allocPacket函数从Mem FreeQ中申请包。
RLC和MAC层处理完成后,软件可以将处理完的包直接压入和物理层接口的发送队列(TxQ)中,后面可以是通过加速器直接做物理层编码,也可以是通过接口发送数据。发送侧包DMA(Tx Pkt DMA)读入包之后,可以自动将包返回一个队列(Tx ReturnQ)。Tx ReturnQ 的选择有两种情况需要分开考虑。对于可以立即释放的包(这个包中PD/BD所指向的缓存没有被其他的PD/BD指向),可以通过QMSS直接回收到Mem FreeQ. 还有一类包不能立即释放,这个包中内存同时还被另一个PD指向(这在包的拷贝,分割中经常出现)。对第二种类型的包,我们需要先让QMSS把包回收到一个临时的回收队列(Tx ReturnQ)中,然后调用Pktlib_freePacket接口,Pktlib会根据这个包的属性以及是否进行过拷贝,切割这些信息,决定是马上将包回收到Mem FreeQ,还是等到所有指向同一个缓存的PD都使用完这个缓存后,再将包回收到Mem FreeQ。从上面的描述我们可以看到,层2下行软件和处理流程前后的两个加速器/外设接口发生了数据交互,但是中间没有任何的数据拷贝,处理效率大大优于传统的方案。
Keystone中的硬件队列可以自动完成多核访问的互斥,由此带来的好处是多核可以同时使用一个Pktlib创建好的堆,同时不需要加入效率较低的互斥锁保护。对于多核同时进行层2处理的方案,这一点也能在一定程度上节省软件的开销。
图3:基于Pktlib的层2下行内存管理
如何成为一名优秀的射频工程师,敬请关注: 射频工程师养成培训
上一篇:专家眼中的RFID智能互连的生活场景
下一篇:覆盖多个频段的振荡器的设计