dm6446的内存分配(davinci)

ARM 85浏览

工作近1年了,也快过年了,总结下一年来学的知识点。

进入正题:

DM6446评估板带有256MB内存,分为7个Segment,Default Memory Map如下:

涉及到内存分配和调整的地方分3类。

1、linux

       供ARM使用的内存,由ARM Linux管理使用,应用程序无法直接访问这些内存。大小如何设置呢,如下:
Windows超级终端通过串口向开发板设置启动参数bootargs时指定,示例:
# setenv bootargs console=ttvS0,115200n8 noinitrd rw ip=dhcp root=/dev/nfs nfsroot=$(nfshost):$(rootpath),nolock mem=120M

2、cmem(dsp和arm的数据BUF共享)

       CMEM是一个连续物理存储空间分配模块,使得ARM端linux进程和DSP端算法直接能够共享缓冲区,当应用程序需要在共享缓冲区动态申请一个连续的物理空间时,通过调用CMEM的API可以实现,申请得到的空间可以供DSP端访问,进行算法处理时数据的传递和处理。

大小如何分配呢,如下:
在loadmodule.sh中使得insmod命令安装cmemk.ko驱动模块时指定CMEM起止物理地址,示例:
insmod cmemk.ko pools=4x30000,2x500000 phys_start=0x0 phys_end=0x3000000 pools_1=4x65536 phys_start_1=0x80000000 phys_end_1=0x80010000 表明在内存0x0~0x2ffffff上开辟了两个内存池,第一个由4个30000字节得缓存组成,第二个由2个500000字节的缓存组成。在内存 0x80000000~0x8000ffff上开辟了一个由4个65536字节缓存组成的内存池。

3、dsp端用的内存

DDRALGHEAP、DDR/DSPLINKMEM、CTRLRESET 这些段存在DSP server源代码中的.tcf或*.tci文件中指定。默认分配如下可自行修改:

/*
 * Setup platform-specific memory map:
 */
var mem_ext = [
{
    comment:    "DDRALGHEAP: off-chip memory for dynamic algmem allocation",
    name:       "DDRALGHEAP",
    base:       0x88000000,   // 128MB
    len:        0x07700000,   // 119MB 0x07A00000
    space:      "code/data"
},
{
    comment:    "DDR2: off-chip memory for application code and data",  //通常 算法要调用的lib的代码量太大的话,编译会提示此地 方出错,需分配大

    name:       "DDR2",
    base:       0x8F700000,   // 250MB  0x8FA00000
    len:        0x00700000,   //   7MB  0x00400000
    space:      "code/data"
},
{
    comment:    "DSPLINK: off-chip memory reserved for DSPLINK code and data",
    name:       "DSPLINKMEM",
    base:       0x8FE00000,   // 254MB
    len:        0x00100000,   //   1MB
    space:      "code/data"
},
{
    comment:    "RESET_VECTOR: off-chip memory for the reset vector table",
    name:       "RESET_VECTOR",
    base:       0x8FF00000,   // 255MB
    len:        0x00000080,   // 128 B
    space:      "code/data"
}
];