当前位置:
文档之家› bootloader学习资料简介
bootloader学习资料简介
• if(blob_status.load_ramdisk) • do_reload("ramdisk");/*复制根文件系统*/
• 等待10秒钟,看用户是否按了键。按键通过串口 读入。如果没有键按下,每过一秒钟输出一个小 数点。
• for(i = 0; i < 10; i++) •{ • serial_write('.'); • retval = SerialInputBlock(commandline, 1, 1); • if(retval > 0) • break; •}
• ldr r0, BLOB_START
• mov pc, r0
第二阶段开始
• 入口程序trampoline.S
• .text
• .globl _trampoline
• _trampoline:
•
……/*全局数据区清0*/
•
ldr r0, stack_end
•
sub sp, r0, #4
• 设置堆栈指针为堆栈段的最后一个地址,也即堆栈向低地 址生长。
• 如果时间结束还没有键按下,则引导操作 系统内核。
• if(retval == 0) •{ • commandline[0] = '\0'; • parse_command("boot"); •}
• 如果有键按下,则进入命令行模式,等待用户输 入命令。每个命令等待输入10分钟。
• for(;;) •{ • DisplayPrompt(NULL);
prefetch_abort
/* 0x0000000C */
data_abort
/* 0x00000010 */
unused
/* 0x00000014 */
fiq
/* 0x0000001C */
irq
/* 0x00000018 */
• BLOB_START:
.word BLOB_ABS_BASE_ADDR
• ldmia r0! ,
*/
{r3-r10} /* r0 = source address
• stmia r1! ,
*/
{r3-r10} /* r1 = target address
• cmp r0 , r2
address*/
/* r2 = source end
• ble copy_loop
• 将BLOB_START中的数据,即Stage 2的第 一条指令加载到程序计数器PC中,跳转到 Stage 2。
•
bl main
•
b _trampoline
•
调用主函数main,当主函数异常返回时,则继续调用。
• 主函数main.c
• int main(void)
•{
• 初始化子系统,包括串口,flash,定时器,命令 模块等。
•
init_subsystems();
• 利用串口打印GNU GPL(General Public License)的一些字符串。如作者,自由软件声明 等。
• numRead = GetCommand ( commandline , MAX_COMMANDLINE_LENGTH , 600 );
• if(numRead > 0) •{ • if((retval = parse_command(commandline)) < 0 ) • ……/*error*/ •} •}
•
SerialOutputString(“…”);
• 获得内存的在地址空间的分布情况;
• 将blob、操作系统内核、根文件系统从 FLASH中下载到内存里,为启动做准备。
• do_reload("blob");/*复制blob*/ • do_reload("kernel");/*复制内核*/
Bootloader
blob 简介
blob 分为两个阶段:
第一阶段:
初始化硬件,将第二阶段的代码复制到内 存中,并跳转到第二阶段的程序入口地址, 这个部分使用汇编语言。
第二阶段:
基本是用C语言编写,主要功能是从FLASH 存储器中引导操作系统或重新下载操作系 统内核和根文件到FLASH存储器中。
blob第一阶段
• adr r0, _start 0x00000000 */
/*_start =
• add r2, r0, #(64 * 1024) KB*/
/* size 64
• add r0, r0, #0x400
• ldr r1, BLOB_START
将第二阶段的代码复制到内存中 :
• copy_loop:
• 关闭Watch Dog 定时器。
• 设置SYSCFG寄存器。关闭Cache , blob运 行时不需要Cache。
• 设置I/O端口,以使能控制外设。 S3C44B0X 有71个多功能的I/O引脚,分为 A、B、C、D、E、F、G 7个I/O端口。这7 个端口的设置,包括控制寄存器,数据寄 存器和上拉电阻寄存器的设置,以开发板 的电路接线图为依据。
• 入口程序 start.S :
• .text
• .globl _start
• _start:
b
•
b
•
b
•
b
•
b
•
b
•
b
•
b
reset
/* 0x00000000 */
undefined_instruction /* 0x00000004 */
software_interrupt /* 0x00000008 */
OVER!
• 设置外部中断的请求方式。 • 屏蔽所有中断。 • 设置CPU的时钟频率。 • Fpllo = [( m * Fin)/( p * 2^s )]。 • 设置I/O端口,串口等的时钟输入为系统主
时钟。
• 设置LOCKTIME寄存器。
• 初始化存储控制器。
• 将第二阶段的代码复制到内存中。
• relocate: