1.分析uboot1.3.4如何引导内核
2.uboot1.3.4和内核之间的参数传递
3.uboot1.3.4的命令实现
4.uboot1.3.4的环境变量
***********************目标***********************************
从上篇文章:u-boot 1.3.4 cpu:s5pv210 架构体系armv7---Makefile概述
可知道bin文件从cpu/s5pc11x/start.o开始执行,以下是uboot第一阶段,汇编的流程总结,对汇编部分不是很熟悉,很多细节以后完善。
cpu/s5pc11x/start.S
首部信息:从S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf芯片手册可知,start.S会运行在iram中,其包含头部信息16字节
异常向量跳转表
进入svc32模式并且关中断
关闭L2 Cache
无效了L1 Cache
关闭MMU(平板地址空间)
读启动信息来知道启动类型
把启动类型写到特殊功能寄存器
设置sp堆栈指针让它指向iram的0xd0036000-12
**************调用了lowlevel_init**********************
{
board/samsung/smdkc110/lowlevel_init.S
初始化了电源管理芯片
初始化了系统时钟
初始化内存控制器
config.mk指定uboot的链接地址
TEXT_BASE = 0xc3e00000
mem_ctrl_asm_init的地址会比0xc3e00000大。
ldr pc, =mem_ctrl_asm_init会怎么样?跑飞!!!
bl mem_ctrl_asm_init会没问题呢??它是相对PC做一个跳转,可以跳到正确的位置。
初始化串口
初始化nand flash
通过出栈来返回
}
**************调用完lowlevel_init**********************
设置sp堆栈指针让它指向dram
从特殊功能寄存器读出启动类型
跳到nand_boot
cpu/s5pc11x/nand_cp.c的copy_uboot_to_ram函数(这里可以调用c语言了,有些是直接在start.S调用汇编版的代码)
{
把nand里面的u-boot拷贝到0x23e00000这个地址处,拷贝了512KB
}
使能了MMU,并且建立一个内存映射关系。把0x23e00000物理地址映射到0xc3e00000虚拟地址。
把bss段清零。
用ldr来做一个跳转,跳转到外部dram。
ldr pc, _start_armboot(lib_arm/board.c)
然后在board.c中,调用各个初始化函数,最后到达
点击(此处)折叠或打开
-
/* main_loop() can return to retry autoboot, if so just run it again. */
-
for (;;) {
-
main_loop ();//common下的main.c
- }