• UBoot源码分析之----内存划分


      1 voidboard_init_f (ulong bootflag)
      2 
      3 {
      4 
      5         ……
      6 
      7          gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);
      8 
      9    //gd是Uboot里面用于存储全局的系统初始化参数的一个指针,这句话是给改变量赋值,这里CONFIG_SYS_INIT_SP_ADDR= 0x42e00000 ,所以gd = 0x42e00000
     10 
     11          memset ((void*)gd, 0, sizeof(gd_t));
     12 
     13    //从gd开始的地方一直到gd+sizeof(gd_t),给该片内存区域填充0
     14 
     15          gd->mon_len = _bss_end_ofs;
     16 
     17    //gd->mon_len表示uboot的长度
     18 
     19          for (init_fnc_ptr = init_sequence;*init_fnc_ptr; ++init_fnc_ptr) {
     20 
     21                   if ((*init_fnc_ptr)() != 0) {
     22 
     23                            hang ();
     24 
     25                   }
     26 
     27         }
     28 
     29          //这里,init_sequence[]是一个函数指针数组,里面放着若干个初始化的函数指针,for循环就是依次执行这些函数指针所指向的函数
     30 
     31          addr = CONFIG_SYS_SDRAM_BASE +gd->ram_size;
     32 
     33          //addr指向SDRAM的顶部,很不明白的是为什么这里gd->ram_size为0,SDRAM的大小为0  addr = 0x4000_0000
     34 
     35          ……
     36 
     37          addr -= (4096 * 4);
     38 
     39         addr &= ~(0x10000-1);
     40 
     41         gd->tlb_addr = addr ;  
     42 
     43          //gd->tlb_addr存储的是TLB表的首地址,为0x3fff_0000,该表所分配的大小是64KB
     44 
     45          ……
     46 
     47         addr -= gd->mon_len;
     48 
     49         addr &= ~(4096 - 1);
     50 
     51          //给uboot分配空间,起始地址是0x3fe6_c214   大小是0x0018_3dec
     52 
     53          //紧接着开辟4KB的空间,起始地址是0x3fe6_c000
     54 
     55          ……
     56 
     57          addr = CONFIG_SYS_LOAD_ADDR;
     58 
     59         //addr = 0xc3e0_0000加载地址
     60 
     61          addr_sp = addr - TOTAL_MALLOC_LEN;
     62 
     63          //addr_sp = 0xc3cf_c000  表示通过malloc分配的地址空间起始地址,其大小为0x104000
     64 
     65            addr_sp -= sizeof(bd_t);
     66 
     67            bd = (bd_t *) addr_sp;
     68 
     69           gd->bd = bd;
     70 
     71         //gd->bd结构体变量存储的是开发板相关的参数,起始地址为0xc3cf_bfd0  大小是0x30
     72 
     73          addr_sp -= sizeof (gd_t);
     74 
     75          id = (gd_t*) addr_sp;
     76 
     77          gd->irq_sp = addr_sp;
     78 
     79          //为id和gd->irq_sp开辟空间,起始地址为0xc3cf_bf58 大小为0x78
     80 
     81          addr_sp -= 3;
     82 
     83          addr_sp &= ~0x07;
     84 
     85          ......
     86 
     87          dram_init_banksize();
     88 
     89          //将1G的SDRAM划分成4个区域
     90 
     91          display_dram_config();
     92 
     93          //根据上面SDRAM的分区计算总的SDRAM大小,然后打印出来
     94 
     95          gd->relocaddr = addr;
     96 
     97          //uboot在内存中的起始地址为0XC3E0_0000
     98 
     99          gd->start_addr_sp = addr_sp;
    100 
    101          //堆栈起始地址为0xc3cf_bf50
    102 
    103          gd->reloc_off = addr -_TEXT_BASE;
    104 
    105          //uboot重定位偏移地址0
    106 
    107          memcpy (id, (void *)gd, sizeof(gd_t));
    108 
    109          //将gd的全部数据拷贝到id里面
    110 
    111          relocate_code (addr_sp, id, addr);
    112 
    113          //返回到start.s中执行代码重定位
    114 
    115 }

    总结:

    board_init_f函数主要是对内存空间做了划分,规定不同的地址空间存放不同的内容。

    空间分布如下:

  • 相关阅读:
    JDK1.8十个新特性
    问题:No more handles [Could not detect registered XULRunner to use]
    在未标记为正在运行时,调用了RunScript
    问题: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
    常用数据库的JDBC 的URL形式
    Myeclipse插件的三种安装方式
    mysqlError: Illegal connection port value '3306>]'
    异常:Bad version number in .class file
    安装msi文件遇到错误code=2502 or 2503 win8
    spring使用RedisTemplate的坑Could not get a resource from the pool
  • 原文地址:https://www.cnblogs.com/zhang2318/p/6077620.html
Copyright © 2020-2023  润新知