阿里云服务器windows系统网站搭建教程,百度登录个人中心,贵州城乡和住房建设厅网站,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