Omap138内存分配总图
board_init_f函数分析
该函数位于/uboot/arch/arm/lib目录下:
1.分析该函数在内存中的位置
起始位置:c1080000
调用位置:c1081258
2.在da850sdi.h中,它的与系统相关的配置是以CONFIG_SYS开头的,与板子相关的配置是以CONFIG开头的。
3.#define CONFIG_SYS_SDRAM_BASE 0xc0000000
gd是一个全局变量,它存储在寄存器r8中,
gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);
->
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE
+ 0x1000 - GENERATED_GBL_DATA_SIZE) /*Fix this */
->
#define GENERAGTED_GBL_DATA_SIZE(128) /*(sizeof(struct global_data)+15)&~15*/
->
0xc0000000+0x1000-0x0080=0xc0000F80
4.uboot链接镜像结构分析
.text代码段
__image_copy_end:代码的镜像部分结束了
*(.dynsym):放了动态符号的内容,加载一些库,elf的时候用
*(./mmutable):动态内存管理的单元都是以4K为单元对齐的
*(.bss)段就是可变换的数据
- 初始化函数的运行(位于/uboot/arch/arm/lib/board.c)
init_sequence中存放了初始化函数的指针
(1)
arch_cpu_init():由于在da850sdi.h中,CONFIG_ARCH_CPU_INIT没有定义,所以该函数不运行。类似的board_early_init_f(), fdtdec_check_fdt()也不运行。
(2)
timer_init():(位于:\uboot\arch\arm\cpu\arm926ejs\davinci)用来初始化时钟,使用的模式如下:
/*using timer34 in unchained 32-bit mode,full speed */
(3)
env_init():(位于:\uboot\common) /* 初始化环境,使用默认的环境*/
使用default_environment[0].
里面包括:CONFIG_BOOTARGS,CONFIG_ETHADDR、CONFIG_SERVERIP、CONFIG_NETMASK等变量。
(4)
init_baudrate();(位于/uboot/arch/arm/lib/board.c)
->getenv_ulong("baudrate",10, CONFIG_BAUDRATE);
/*取名称为“baudrate”的环境变量,如果取不到,就设置为以十进制表示的CONFIG_BAUDRATE的值。*/
这个定义在default_environment[ ]中找不到,但是在da850sdi.h中可以找到CONFIG_BAUDRATE的定义。
#define CONFIG_BAUDRATE 115200
(5)
serial_init()和console_init_f()这两个初始化函数完成之后,就可以通过串口和uboot之间进行命令的交互了。
serial_init():(位于/uboot/common)
->
get_current()->init();
->
__weak struct serial_device*default_serial_console(void)
__weak的意思是如果在别的地方已经定义了,那么此处的定义失效。
->
INIT_ESERIAL_STRUCTURE(port, name)
->{
eserial0,\
eserial0_init,\
NULL,\
eserial0__setbrg,\
eserial0__getc,\
eserial0__tstc,\
eserial0__putc,\
eserial0__puts,
}
console_init_f():(位于\uboot\common)用于显示终端的初始化
(6)display_banner();用来打印版本号
(7)dram_init():(位于\uboot\arch\arm\cpu\arm926ejs\davinci)
确定可用的DDR大小为512M。
->get_ram_size()
/*
* Check memory range for
valid RAM. A simple memory test determines
* the actually available RAM
size between addresses `base' and
* `base + maxsize'.
*/