DM81xx DVR_RDK Memory Map
在DVR RDK中支持多种不同的usecases,为了更有效地利用内存,在SYS/BIOS侧将物理内存配制成多个段,不同的段的大小是可以配置的,具体属性各不相同。 下面简单介绍下各个区域的用途: Linux Memory:分配给linux管理的内存区域 Shared Regions:受限制的共享内存区,根据配置不同,其属性也各不相同 l Syslink MessageQ/IPC ListMP:Non-cached on M3 l Bitstream Buffer:Cached on A8. Cached on M3, although access by DMAs l Frame Buffer:VPSS - Video M3 Frame Buf l IPC ListMP for Dual-M3:Cached on M3 Slave Code and Data Section Memory:各个处理器的代码段和数据段,包括DSP和Dual-M3系统 Remote Debug Memory:即2.2.1中所说的Remote debug部分的共享内存 VPDMA Descriptiors Memory:用于存放VPSS M3部分分配的DMA配置 Host VPSS Notify Shared Memory:用于使用FBDev时传递A8侧命令至VPSS M3侧 Tiler Memory:为HDVPSS和HDVICP提供Tiled内存,包含8bit区和16bit区。 FBDev Shared Memory:为VPSS M3侧驱动提供内存 硬件上的限制:
- Ducati M3系统无法访问超过0xA0000000的代码区;
- Ducati M3系统无法访问超过0xE0000000的数据区;
- Ducati M3系统中的AMMU只能管理512MB或者32MB的大内存段(largePages),被划分成了四个段,其中一段用于映射寄存器,因此AMMU只能访问这三个内存段;
软件上的限制:
- 由于linux系统的内核空间为1GB、用户空间为3GB,因此内核最大只能映射1GB的存储空间,其中包含了启动参数及共享内存区;
- 共享内存是静态分配的,因此修改后需要重新编译链接;
- 由于映射Frame Buffer会消耗大量的内核空间,因此并未被映射到A8侧,用户在需要的时候动态映射(如使用IPC Frames In/Out link);
在修改内存分布的时候需要注意的事项:
- 必须考虑上述的软硬件上的限制;即VPSS M3和VIDEO M3的代码段必须放置在低512MB的物理内存里,并且需要在AMMU配置中将虚拟地址一一映射到物理地址;
- 最少需要留2MB的空间给Syslink-Notify给内核空间,用于A8和VPSS M3的通信,位置改变的时候,需要注意bootargs中的参数“notifyk.vpssm3_sva”也需要相应修改;
- RemoteDebug段是用于方便调试用的打印消息暂存区,除A8外,所有消息打印都存在该区域,并使用Vps_printf调用,送到linux侧串口终端打印出来。可用于日志记录。在原有的一套代码中,需要自己根据内存配置指定日志记录所处的内存位置。用户可以将该套代码修改后集成到源程序中,做出实时打印来方便调试。具体位置可以根据配置,修改TI原有的genaddrinfo.xs脚本来产生一个头文件来指定(具体可仿照genaddriinfo.xs中生成env_xx_xx.sh的方法生成一个宏定义的头文件autocfg_mem.h,供其他代码调用)。
- Linux Memory大小改变同样也需要修改bootargs中的“mem”参数,如果被分成多段的话,则可以使用“mem=<SIZE>@<ADDR>”来指定,需要注意的是TI在后续版本中要求Linux Memory需要按照4MB对齐。
- Tiler Memory的起始地址需要128MB对齐,如果不使用Tiler Memory,该段内存会被用于Frame Buffer或者Bitstream Buffer的补充;
|