【OK210试用体验】u-boot篇 -- u-boot内存分布 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】u-boot篇 -- u-boot内存分布

【OK210试用体验】u-boot篇 -- u-boot内存分布


在u-boot.lds/u-boot-spl.lds这个链接脚本中,有对内存分配情况的大概框架。

    通过u-boot的启动流程分析和针对S5PV210单板的简单移植,简单分析代码走向之后,我们可以得出u-boot的内存分配情况。



链接脚本主要内容



   
  1. . = 0x00000000;

  2.         . = ALIGN(4);
  3.         .text :
  4.         {
  5.                 *(.__image_copy_start)
  6.                 CPUDIR/start.o (.text*)
  7.                 *(.text*)
  8.         }

  9.         . = ALIGN(4);
  10.         .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

  11.         . = ALIGN(4);
  12.         .data : {
  13.                 *(.data*)
  14.         }

  15.         . = ALIGN(4);

  16.         . = .;

  17.         . = ALIGN(4);
  18.         .u_boot_list : {
  19.                 KEEP(*(SORT(.u_boot_list*)));
  20.         }

  21.         . = ALIGN(4);

  22.         .image_copy_end :
  23.         {
  24.                 *(.__image_copy_end)
  25.         }

  26.         .rel_dyn_start :
  27.         {
  28.                 *(.__rel_dyn_start)
  29.         }

  30.         .rel.dyn : {
  31.                 *(.rel*)
  32.         }

  33.         .rel_dyn_end :
  34.         {
  35.                 *(.__rel_dyn_end)
  36.         }

  37.         .end :
  38.         {
  39.                 *(.__end)
  40.         }

  41.         _image_binary_end = .;

  42.         /*
  43.          * Deprecated: this MMU section is used by pxa at present but
  44.          * should not be used by new boards/CPUs.
  45.          */
  46.         . = ALIGN(4096);
  47.         .mmutable : {
  48.                 *(.mmutable)
  49.         }

  50. /*
  51. * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c
  52. * __bss_base and __bss_limit are for linker only (overlay ordering)
  53. */

  54.         .bss_start __rel_dyn_start (OVERLAY) : {
  55.                 KEEP(*(.__bss_start));
  56.                 __bss_base = .;
  57.         }

  58.         .bss __bss_base (OVERLAY) : {
  59.                 *(.bss*)
  60.                  . = ALIGN(4);
  61.                  __bss_limit = .;
  62.         }

  63.         .bss_end __bss_limit (OVERLAY) : {
  64.                 KEEP(*(.__bss_end));
  65.         }

  66.         .dynsym _image_binary_end : { *(.dynsym) }
  67.         .dynbss : { *(.dynbss) }
  68.         .dynstr : { *(.dynstr*) }
  69.         .dynamic : { *(.dynamic*) }
  70.         .plt : { *(.plt*) }
  71.         .interp : { *(.interp*) }
  72.         .gnu.hash : { *(.gnu.hash) }
  73.         .gnu : { *(.gnu*) }
  74.         .ARM.exidx : { *(.ARM.exidx*) }
  75.         .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
复制代码


内存分配



    (此图来源于网络,感谢作者)

    自下而上u-boot映像的地址0并非指物理地址0,由不同的启动方式映射到不同的地址。例如v210是映射到0xD0000000处的iROM。

    SDRAM_BASE 和 TEXT_BASE 的定义位于 include/configs/smdkv210.h中,可以根据自己单板的要求来修改地址。

    _end和__bss_start为链接脚本文件中最后定义的bss段,在链接时确定,并与u-boot映像编译在一起。

    从图可以看出,iROM运行汇编代码拷贝BL1到SDRAM中,拷贝到的地址是TEXT_BASE。

    u-boot的栈顶分配代码,在arch/arm/lib/crt0.S中。
  1. ldr        sp, =(CONFIG_SYS_INIT_SP_ADDR)
  2.         bic        sp, sp, #7        /* 8-byte alignment for ABI compliance */
  3.         sub        sp, sp, #GD_SIZE        /* allocate one GD above SP */
  4.         bic        sp, sp, #7        /* 8-byte alignment for ABI compliance */
  5.         mov        r9, sp                /* GD is above SP */
  6.         mov        r0, #0
复制代码


    另外附加两张在网上找的内存分配图,感谢作者:


1个回复

HelloWii 发表于 2015-9-8 08:21:21
期待楼主后期更多的分享。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-4-25 00:34 , Processed in 0.363088 second(s), Total 33, Slave 23 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表