首页 理论教育深入剖析Linux内核与设备驱动之TI芯片内存管理实现

深入剖析Linux内核与设备驱动之TI芯片内存管理实现

【摘要】:1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。

1ᤫ芯片片内内存使用

TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。而片内内存则有各种各样的使用方式,DM3730芯片是将其直接映射到内核虚拟地址空间的特定地址以供使用,采用该方法的原因主要是由于电源管理很多功能需要片内内存。这里介绍一下映射部分,具体的使用则在芯片电源管理部分进行介绍。相关映射代码如下:

omap_map_sram是将片内内存映射到内核的虚拟地址空间,使用的方式是按照IO映射进行的,主要是由于对于ARM体系结构使用统一的地址,另外需要关掉cache进行映射,映射到omap_sram_base(使用变量是因为可以根据芯片调整)指定的地址。该接口是在板级支持的map_io中被调用,这样DM 3730内核就可以直接使用相应的虚拟地址进行操作了。使用相应空间的接口函数是omap_sram_push,详细代码如下:

从omap_sram_push可见,其采用从后往前的方式进行分配,主要是将需要的数据复制到相应的片内空间。芯片电源管理部分可知具体的数据内容,这里可以先说明一下,其内容主要是执行的代码。

2ᤫ芯片保留物理内存

SoC内部通常有些模块需要在启动时保留部分内存空间。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。DM 3730同样有该需求,看看DM3730是如何实现相应功能的:

之前在介绍Linux内核初始化时看到arm_memblock_init,其中会根据启动时的参数获得物理内存的memblock信息,在该接口中会调用板级的reserve接口,就可以保留内存空间,使得Linux内核不管理这部分物理内存,而是留给板级相关的驱动去管理,这就相当于Linux内核开出一块保留区域给处理器自由使用。DM 3730就是利用该接口,保留了相关的内存,为特殊的驱动使用,包括显示驱动和DSP相关功能部分。具体的内容还是在实际驱动中进行介绍。(www.chuimin.cn)

3ᤫ独立cmem管理

之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。其主要目的是针对视频SoC的视频加速应用,如视频编解码功能。视频编解码功能通常属于应用的范畴,而如果通过硬件加速来实现视频编解码,则其需要连续的物理空间,这就相当于要在应用中使用连续的物理内存。如果由Linux内核直接管理和提供这部分内存是无法实现的,这样芯片厂商就开发相应的驱动,通过将物理内存交由驱动管理,而不是内核直接管理来实现该功能。具体的映射则通过虚拟地址的映射机制来实现。

对于TI的cmem有两种分配模式:一种是采用pool算法实现的,通过参数来设定所管理的物理空间的地址范围及每个内存池的大小及数目,以驱动的形式管理这部分内存;另一种是heap模式,把内存区域作为堆来使用。这两种模式对于内存的管理都是通过IO控制来完成。下面是一个使用的例子:

这个例子就是对大块的物理内存使用堆模式,而对于片内的内存采用了pool模式管理。

当然对内存管理不可忽视的是处理器cache相关的操作,为了给相关的应用提供完整的功能,独立的内存管理同样也要提供cache相关的操作接口,对于cmem提供的完整操作接口如下:

从功能看已经设计了完整的内存管理和cache管理功能。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。