提供微网站制作多少钱,seo自动刷外链工具,网站建设如何选择,网站开发会遇到哪些问题Uboot的启动流程分为两个阶段#xff0c;第一阶段主要是汇编语言编写#xff0c;第二阶段是C语言编写#xff0c;每个阶段所做的工作不同#xff0c;这篇文章分析的是uboot 2010版#xff0c;以tiny4412的uboot为例。 启动过程涉及的主要文件#xff1a;
arch/arm/cpu/a… Uboot的启动流程分为两个阶段第一阶段主要是汇编语言编写第二阶段是C语言编写每个阶段所做的工作不同这篇文章分析的是uboot 2010版以tiny4412的uboot为例。 启动过程涉及的主要文件
arch/arm/cpu/armv7/start.S
board/samsung/myboard/lowlevel_init.S
arch/arm/lib/crt0.S
arch/arm/lib/board.c
arch/samsung/myboard/myboard.c第一阶段 uboot的入口的地址是arch/arm/cpu/armv7/start.S, 这可以从相同路径下的连接脚本u-boot.lds 中知道。 arch/arm/cpu/armv7 /start.S 平台相关CPU工作模式设为SVC模式关MMU关icahce(CPU相关) board/samsung/fs4412/lowlevel_init.S 开发板相关:关看门狗内存初始化时钟初始化串口初始化(board相关初始化最基本的硬件环境 第二阶段 arch/arm/lib/crt0.S _main 函数所在处初始化SP为C语言准备代码重定位清BSS设置R0 R1 R2 R8相应寄存器 arch/arm/lib/board.c board_init_f 函数 填充GD结构体初始化外设 main_loop()函数超循环
第一个阶段
在这个阶段主脉络就是部分硬件初始化—》加载完整的uboot到RAM—》跳转到第二阶段入口开始执行。 整个过程涉及两个重要的文件start.S和lowlevel_init.S。Start.S涉及到特定硬件设备的读写寄存器操作以及特定体系结构的汇编语言lowlevel_init.S涉及的操作和文件名吻合完成底层的初始化 执行上面的_start: b reset 后跳转到下面这段代码继续运行
继续往下分析 程序跳转到这个函数里我们进去看看
上面的lowlevel_init在board/samsung/myboard/lowlevel_init.S 之后回到start.S执行 上面的代码完成了gt结构体部分成员赋值 程序往下执行到relocate_code 经过上面的操作uboot已经把字节从SD卡拷贝到SDRAM中并且为之后的执行准备好了各种参数最终跳转到第二部分的入口board_init_r 从上面可以总结出 1.Bootloader第一阶段的功能
硬件设备初始化。为加载Bootloader的第二阶段代码准备RAM空间。设置CPU的速度、时钟频率及终端控制寄存器初始化内存控制器复制Bootloader的第二阶段代码到RAM空间中。设置好栈。跳转到第二阶段代码的C入口点。 在第一阶段进行的硬件初始化一般包括关闭WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等。这些并不都是必需的比如S3C2410/S3C2440的开发板所使用的U-Boot中就将CPU的速度和时钟频率的设置放在第二阶段。 甚至将第二阶段的代码复制到RAM空间中也不是必需的对于NOR FLASH等存储设备完全可以在上面直接执行代码只不过相比在RAM中执行效率大为降低。
第二阶段分析
初始化本阶段要使用的硬件设备。检测系统内存映射memory map。将内核映像和根文件系统映像从FLASH上读到RAM空间中。为内核设置启动参数。调用内核。 C语言代码部分 arch/arm/lib/board.c中的board_init_f是C语言开始的函数也是整个启动代码中C语言的主函数同时还是整个u-boot的主函数该函数只要完成如下操作 1调用一系列的初始化函数。 2初始化Flash设备。 3初始化系统内存分配函数。 4如果目标系统拥有NAND设备则初始化NAND设备。 5如果目标系统有显示设备则初始化该类设备。 6初始化相关网络设备填写IP、MAC地址等。 7进去命令循环即整个boot的工作循环接受用户从串口输入的命令然后进行 U-Boot的启动顺序流程图