fl2440的uboot在内存中的分布
来源:互联网 发布:耕地红线 知乎 编辑:程序博客网 时间:2024/04/29 20:56
(此图是我个人画的不知道有哪些地方有问题,请提出宝贵意见 )
如果u-boot是从nandflash启动,硬件会自动把nandflash前0x1000Byte(即4KB)拷贝到 ‘Steppingstone’中。 ‘Steppingstone’有两个起始地址映射一个是0x0,另一个是0x40000000。这时候PC跳转到0x0地址处,即 ‘Steppingstone’起始位置处执行者4KB的代码。这段代码初始化了cpu模式和时钟等等,有必要说下这时候的堆栈初始化这时候sp指针直接指向了0x33f0fffC(即 STACK_BASE+STACK_SIZE-4),fp是0x0也就是‘Steppingstone’的起始地址,FP寄存器及frame pointer介绍。
然后又将nandflash存储空间的起始0x0位置的到 0X60000 (#define LENGTH_UBOOT 0x60000)拷贝到0x33f80000(TEXT_BASE)。64MB的SDRAM是挂载到NGCS6上的,NGCS6的起始地址是0x30000000,也就是说SDRAM的起始地址是0x30000000,终止地址是0x34000000.因为0x34000000 - 0x33f80000 = 0x80000 是大于u-boot的代码空间0x60000 (即LENGTH_UBOOT),0x80000 - 0x60000 = 0x20000,就是说u-boot上的高地址部分有0x20000的空着。
上面说的‘Steppingstone’中的哪4KB代码拷贝完了自己后并没有立即跳到0x33f80000这个位置去执行,而是接着初始化了SDRAM中的堆栈(这是第二次初始化堆栈了!),怎么初始化的呢?我们看看首先看sp = _TEXT_BASE - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_GBL_DATA_SIZE /* -(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)因为没有用到所以注释掉,这个u-boot没有用到中断 */ - 12(这个12是leave 3 words for abort-stack)= 0x33f80000 - (0x10000 + 0x4000) - 0x80 - 0xc = 0x33f6bf74(sp 没有设置)。.rodata、.data、.got(这是什么??先放着)、.u_boot_cmd、.bss区是在arch/arm/cpu/arm920t/u-boot.lds中定义的,貌似没有具体值,这些是在u-boot代码段后面,紧贴在0x33fe0000前面。
在start_armboot中有这个数据结构指针:gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t)),按上面的分析它在全局数据区(global_data)的顶部,这个指针指向的数据结构global_data如下:
typedef struct global_data { bd_t *bd; unsigned long flags; unsigned long baudrate; unsigned long have_console; /* serial_init() was called */ unsigned long env_addr; /* Address of Environment struct */ unsigned long env_valid; /* Checksum of Environment valid? */ unsigned long fb_base; /* base address of frame buffer */#ifdef CONFIG_VFD unsigned char vfd_type; /* display type */#endif#ifdef CONFIG_FSL_ESDHC unsigned long sdhc_clk;#endif#if 0 unsigned long cpu_clk; /* CPU clock in Hz! */ unsigned long bus_clk; phys_size_t ram_size; /* RAM size */ unsigned long reset_status; /* reset status register at boot */#endif void **jt; /* jump table */} gd_t;
bd_info数据结构如下:
typedef struct bd_info { int bi_baudrate; /* serial console baudrate */ unsigned long bi_ip_addr; /* IP Address */ struct environment_s *bi_env; ulong bi_arch_number; /* unique id for this board */ ulong bi_boot_params; /* where this board expects params */ struct /* RAM configuration */ { ulong start; ulong size; } bi_dram[CONFIG_NR_DRAM_BANKS];} bd_t;
global_data数据结构中的大小为24B + 28B = 52B,其中CONFIG_VFD和CONFIG_FSL_ESDHC没定义,全局数据区顶部放着52B。(没有确认)
下面我看到这个gd->bd = (bd_t*)((char*)gd - sizeof(bd_t))很困惑,岂不是把bd_info数据结构放到global_data结构前面去了?
- fl2440的uboot在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 程序在内存中的分布
- 系统管理员常用的几个工具
- Android编译过程详解(三)
- Android学习笔记之(一)开发环境搭建
- VC 操作Excel
- Spring Data JPA 简单介绍(转)
- fl2440的uboot在内存中的分布
- PHP传值和传引用、传地址的区别
- version `GLIBC_2.14' not found 解决方法.
- 在web开发学习中模式的转变
- Android结束Activity完美退出程序
- Android 实现书籍翻页效果----原理篇
- ListView性能
- 32位Windows7系统使用4G内存破解教程
- 关于拔U盘时提示“现在无法停止通用卷设备”的解决方法