建设银行的官方网站电话,wordpress 网站开发,网站开发技术难点,乌市网络营销公司一.  uboot启动流程 _main 函数中会调用 board_init_f 函数#xff0c;本文继续简单分析一下 board_init_f 函数。 
具体分析 board_init_f函数的第二部分#xff1a;内存分配代码。 
本文继上一篇文章的学习#xff0c;地址如下#xff1a; 
uboot启动流程-涉及board_init…一.  uboot启动流程 _main 函数中会调用 board_init_f 函数本文继续简单分析一下 board_init_f 函数。 
具体分析 board_init_f函数的第二部分内存分配代码。 
本文继上一篇文章的学习地址如下 
uboot启动流程-涉及board_init_f 函数-CSDN博客 二.  uboot内存分配 下面具体分析 board_init_f 函数的后半部分内存分配代码。 
board_init_f 函数里面有大量的条件编译代码这里为了缩小篇幅将条件编译部分删除掉了去掉条件编译以后的board_init_f 函数 后半部分代码如下  
1 static init_fnc_t init_sequence_f[]  {
2 setup_mon_len,
......
32 /*
33 * Now that we have DRAM mapped and working, we can
34 * relocate the code and continue running from DRAM.
35 *
36 * Reserve memory at end of RAM for (top down in that order):
37 * - area that wont get touched by U-Boot and Linux (optional)
38 * - kernel log buffer
39 * - protected RAM
40 * - LCD framebuffer
41 * - monitor code
42 * - board info struct
43 */
44 setup_dest_addr, 
45 reserve_round_4k, 
46 reserve_mmu, 
47 reserve_trace, 
48 reserve_uboot, 
49 reserve_malloc, 
50 reserve_board, 
51 setup_machine, 
52 reserve_global_data, 
53 reserve_fdt, 
54 reserve_arch, 
55 reserve_stacks, 
56 setup_dram_config, 
57 show_dram_config, 
58 display_new_sp, 
59 INIT_FUNC_WATCHDOG_RESET
60 reloc_fdt, 
61 setup_reloc, 
62 NULL,
63 }; 第 44 行 setup_dest_addr  函数设置目的地址设  gd-ram_size  gd-ram_top  gd-relocaddr  这三个的值。 我可以修改  uboot  代码直接将这些值通过串口打印出来比如这里我们修改文件  common/board_f.c 因为  setup_dest_addr  函数定义在文件  common/board_f.c  中。 在 setup_dest_addr 函数加入打印如下 printf(gd-ram_size: %#x\n, gd-ram_size);printf(gd-ram_top: %#x\n, gd-ram_top);printf(gd-relocaddr: %#x\n, gd-relocaddr); 重新编译 uboot源码后生成 u-boot.bin。将 u-boot.bin拷贝到 ubuntu的 tftp服务设置目录下。 
通过 tftp服务将 u-boot.bin下载到开发板。开发板uboot命令模式下输入如下 tftp 0x87800000 u-boot.bin
Using FEC1 device
TFTP from server 192.168.1.66; our IP address is 192.168.1.50
Filename u-boot.bin.
Load address: 0x87800000
Loading: #################################2.7 MiB/s
done
Bytes transferred  476700 (7461c hex)运行下载到开发板的 DRAM的uboot。操作如下 go 0x87800000
## Starting application at 0x87800000 ...U-Boot 2016.03 (Oct 02 2023 - 21:20:41 0800)CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 44C
Reset cause: unknown reset
Board: MX6ULL ALIENTEK NAND
I2C:   ready
DRAM:  gd-ram_size: 0x10000000
gd-ram_top: 0x90000000
gd-relocaddr: 0x90000000
256 MiB
......可以看出 这里三个参数 
gd-ram_size  0X10000000 //ram 大小为 0X10000000 256 MB
gd-ram_top  0X90000000 //ram 最高地址为 0X800000000X100000000X90000000
gd-relocaddr  0X90000000 //重定位后最高地址为 0X90000000 第  45  行   reserve_round_4k  函数用于对  gd-relocaddr  做  4KB  对 齐  因 为gd-relocaddr0XA0000000 已经是  4K  对齐了所以调整后不变。  第  46  行 reserve_mmu  函数留出 MMU  的  TLB  表的位置分配  MMU  的  TLB  表内存以后会对  gd-relocaddr  做  64K  字节对齐。完成以后  gd-arch.tlb_size 、 gd-arch.tlb_addr  和  gd-relocaddr如下所示 DRAM:  gd-arch.tlb_size: 0x4000  //MMU 的 TLB 表大小
gd-arch.tlb_addr: 0x8fff0000     //MMU 的 TLB 表起始地址64KB 对齐以后
gd-relocaddr: 0x8fff0000         //relocaddr 地址第 47 行reserve_trace 函数留出跟踪调试的内存I.MX6ULL 没有用到  第  48  行 reserve_uboot  函数 留出重定位后的 uboot  所占用的内存区域 uboot  所占用大小由gd-mon_len  所指定留出  uboot  的空间以后还要对  gd-relocaddr  做  4K  字节对齐并且重新设 置  gd-start_addr_sp 打印如下 DRAM:  gd-mon_len: 0xb7394
gd-start_addr_sp: 0x8ff38000
gd-relocaddr: 0x8ff38000第  49  行 reserve_malloc  函数留出 malloc  区域调整  gd-start_addr_sp  位置 malloc  区域由宏    TOTAL_MALLOC_LEN  定义打印如下   DRAM:  TOTAL_MALLOC_LEN:    0x1020000 gd-start_addr_sp: 0x8ef18000      //0X8FF38000-16MB-4MB0X8EF18000