zoukankan      html  css  js  c++  java
  • uboot在nandflash存储时内存和NandFlash存储空间

    硬件采用nandflash,nandflash为8位数据宽度,没有dataflash和norflash。

    Nandflash空间分配为 bootstrap + u-boot + env + linux 。

    |

    |  bootstrap  |          | u-boot             |  env  |                   |     linux    |

    |______________________________________________________________________________

    0x0       0x1000    0x20000      0x60000  0x80000   0xA0000

    0          4K        128K                 384K         512K        640K

    uboot的启动参数中定义linux内核镜像在Nandflash中的位置。

    uboot的CFG_NAND_BASE定义Nand起始地址。(起始地址为0x40000000,结束地址0x4FFFFFFF,共256M)

    uboot的CFG_NAND_DBW_8定义数据宽度。

    CFG_ENV_OFFSET或CFG_ENV_OFFSET_REDUND定义env在NandFlash的起始地址,

    当配置CFG_ENV_OFFSET_REDUND时,env存储在CFG_ENV_OFFSET_REDUND指定的位置(优先选择)。

    CFG_ENV_SIZE定义env在Nandflash中的空间大小。

    env的具体实现在env_nand.c中。

    --------------------------------------------------------------------------------------------------------------------

    内存空间分配(起始地址0x2000 0000,结束地址0x2400 0000,共64M)

    |

    |                               |  linux      |            | env |            |     u-boot    |

    |

    0x2000 0000        0x2040 0000                                0x23F0 0000

    0                                                                                63M

    uboot中CFG_LOAD_ADDR定义RAM中linux的load address。

    board/atmel/at91sam9260ek/config.mk定义TEXT_BASE,其为u-boot在内存中的起始地址。

    ------------------------------------------------------------------------------------------------------------------------------

    待解决:env在内存中位置????

    (board/atmel/at91sam9260ek/at91sam9260ek.c--àboot_params)

    答:env在内存中的空间是由malloc分配的(env_common.c中的env_relocate()),因此其在内存中的位置是一直变化的。

    每次系统启动时,env在内存中位置可能都不一样。

    env malloc分配的空间位于gd结束至0x23f00000之间的CFG_MALLOC_LEN段内,具体实现在lib_arm/board.c中。

    以现有产品为例,仅采用nandflash存储bootstrap+uboot+kernel+rootfs:

    |

    |              |  bd    |    gd    |            |  uboot  |

    |                sizeof(bd)    sizeof(gd)     CFG_MALLOC_LEN

    0x20000000    0x23e7efb8    0x23e7efdc    0x23e7f000      0x23f00000  0x24000000

    本例中CFG_MALLOC_LEN 为0x81000。

    -----------------------------------------------------------------------------------------------------------------------------------

    待解决:malloc分配地址为什么位于gd结束到0x23f00000之间???

    在common/dlmalloc.c中有关于malloc的具体实现。

    uboot实现了一种malloc机制。

    -----------------------------------------------------------------------------------------------------------------------------------

    K9F2G08U0B大小为256MB,2048块(0-2047),每块大小为128KB。

  • 相关阅读:
    [SDOi2012]Longge的问题(洛谷 2303)
    Biorhythms(信息学奥赛一本通 1639)
    【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)
    青蛙的约会(信息学奥赛一本通 1631)(洛谷 1516)
    负数求余究竟怎么求???
    X-factor Chain(信息学奥赛一本通 1628)
    同余问题2(超详细!!!)
    map函数怎么用咧↓↓↓
    同余问题1(超详细!!!)
    python -- 连接 orclae cx_Oracle的使用 二
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/4849096.html
Copyright © 2011-2022 走看看