02.07.2013 Views

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

此处的含义很好理解,就是把地址为IRQ_STACK_START中的值赋值给sp。<br />

即获得IRQ的堆栈的起始地址。<br />

而对于IRQ_STACK_START,是我们前面这里cpu_init源码(点击可掉转到对应位置)<br />

就提到过的:<br />

┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳<br />

int cpu_init (void)<br />

{<br />

/*<br />

* setup up stacks if necessary<br />

*/<br />

#ifdef CONFIG_USE_IRQ<br />

- 4;<br />

IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE<br />

FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;<br />

FREE_RAM_END = FIQ_STACK_START - CONFIG_STACKSIZE_FIQ -<br />

CONFIG_STACKSIZE;<br />

#else<br />

FREE_RAM_SIZE = FREE_RAM_END - PHYS_SDRAM_1;<br />

FREE_RAM_END = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE<br />

- 4 - CONFIG_STACKSIZE;<br />

#endif<br />

}<br />

FREE_RAM_SIZE = FREE_RAM_END - PHYS_SDRAM_1;<br />

return 0;<br />

┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻<br />

而此处,就是用到了,前面已经在cpu_init()中重新计算正确的值了。<br />

即算出IRQ堆栈的起始地址,其算法很简单,就是:<br />

- 4;<br />

IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE<br />

即,先减去malloc预留的空间,和global data,即<br />

在<br />

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\board\EmbedSky\board.c<br />

中定义的全局变量:<br />

DECLARE_GLOBAL_DATA_PTR;<br />

而此宏对应的值在:<br />

u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\include\asm-arm\global_data.<br />

h<br />

中:<br />

#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")<br />

即,用一个固定的寄存器r8来存放此结构体的指针。<br />

(注:这也对应着编译uboot的时候,你所看到的编译参数-ffixed-r8)<br />

此gd_t的结构体,不同体系结构,用的不一样。<br />

而此处arm的平台中,gd_t的定义在同一文件中:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!