U-Boot属于两个阶段的Bootloader,第一阶段的文件为cpu/arm920t/start.S和 board/smdk2410/lowlevel_init.S,前者平台相关,后者开发板相关。
U-Boot第一阶段代码分析
1、硬件设备初始化
cpu的工作模式,关闭WATCHDOG,设置FCLK、HCLK、PCLK的比例,关闭MMU、CACHE。
2、为加载Bootloader的第二阶段代码准备RAM空间
指初始化芯片
3、复制Bootloader的第二阶段代码到RAM空间中
将U-Boot的代码都复制到SDARM中
4、设置好栈
留出一段内存供后面使用
5、跳转到第二阶段代码的C入口点
在跳转之前,还要清除BSS段
U-Boot第二阶段代码分析
第二阶段从start_armboot函数开始
移植u-boot的主要工作在于对硬件的初始化、驱动。
1、初始化本阶段要使用到的硬件设备
最主要的是设置系统时钟、初始化串口。
2、检测系统内存映射
设置内存起始地址
我使用的优龙板sdram的起始地址:0x30000000
3、U-boot命令的格式
即使是内核的启动,也是通过U-Boot命令来实现的。
U-Boot中每一个命令都通过U_BOOT_CMD来宏定义。
4、为内核设置启动参数
通过标记列表向内核传递参数
补充:内核的复制和启动,可以通过如下命令来完成:bootm从内存、ROM、NOR Flash中启动内核,bootp则通过网络来启动,而nboot从NAND Flash启动内核。
参考:韦东山的《嵌入式linux应用开发完全手册》
相关文章









