【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|德赢Vwin官网(湘ICP备2023018690号)

GMT+8, 2024-8-29 00:51, Processed in 0.759678 second(s), Total 58, Slave 41 queries .

Powered by德赢Vwin官网 网

© 2015bbs.elecfans.com

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