欢迎来到天天文库
浏览记录
ID:46587722
大小:144.08 KB
页数:3页
时间:2019-11-25
《第二章--Bootloader启动流程分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第2章Bootloader启动流程分析2.1Bootloader启动的两个阶段从操作系统的角度看,Bootloader的总目标就是正确地调用内核来执行。另外,由于Bootloader的实现依赖于CPU的体系结构,因此大多数Bootloader都分为stage1和stage2两大部分,以便使Bootloader的功能更加强大和提供更加良好的移植性能。stage1主要是一些依赖于CPU体系结构的代码,比如硬件设备初始化代码等。这一阶段的代码主要是通过汇编来实现的,已达到短小精悍和高效的目的。stage1为位置无关代码,通
2、常在Flash中运行。所以有的指令为相对寻址,可以在任何位置运行。stage1负责的主要任务有:①硬件设备初始化包括:关闭Watchdog、关闭中断、设置CPU的速度和时钟频率、配置SDRAM存储控制器及IO、关闭处理器内部指令/数据Cache等;②为加载Bootloader的stage2代码准备RAM空间(这个地址由链接脚本指定为运行域地址,通常为RAM的高端地址)测试内存空间是否有效;③复制Bootloader的stage2代码到RAM空间中;④设置好堆栈;⑤跳转到stage2的C函数入口点。stage2则是通常
3、用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。stage2负责的主要任务有:①初始化本阶段要使到的硬件设备(如串口、Flash和网卡等);②检测系统内存映射;③没有用户干预时将内核映像从Flash读到RAM空间中;④为内核设置启动参数;⑤调用内核。2.2Bootloader的内核调用操作系统的内核映像一般是存储在Flash上的,当Bootloader将内核复制到RAM里之后可能还需要解压。但是对于有自解压能力的内核而言是不需要Bootloader来解压的。而Bootloader调用内
4、核的方法就是直接跳转到内核的第一条指令处。在调170用内核之前下列的条件必须要满足:1.CPU寄存器的设置①R0为0;②R1为机器码;③R2为启动参数,标记列表在RAM中的起始基地址。2.CPU工作模式①必须禁止中断(IRQ和FIQ);②CPU必须设置为SVC模式。3.Cache和MMU的设置①MMU必须关闭;②指令Cache可以打开或关闭;③数据Cache必须关闭。2.2.1Bootloader与内核的交互当内核启动时,启动参数一般是从Bootloader中传递而来的。那么Bootloader传递参数的存放地址和参
5、数的数据结构就都是需要关心的。由于Bootloader和内核不是同时启动运行的,因此Bootloader要向内核传递参数只有将参数存放在一个指定的地址,然后内核再从这个地址中读取启动参数。在U-Boot中,传递参数的数据结构是以标记的形式来体现的。而参数的传递通过标记列表的形式来实现。标记列表由ATAG_CORE开始,以ATAG_NONE标记结束。这里的ATAG_CORE,ATAG_NONE是各个参数的标记,本身是一个32位值。标记的数据结构为tag,它由一个tag_header结构体和一个联合体组成。tag_hea
6、der结构体表示标记的长度和类型,比如是表示内存还是命令行参数。对于不同类型的标记使用不同的联合体。对于tag和tag_header的定义可以在网蜂提供的U-Boot的源码中arch/arm/include/asm/setup.h文件中找到,即:structtag{structtag_headerhdr;union{structtag_corecore;structtag_mem32mem;structtag_videotextvideotext;structtag_ramdiskramdisk;structtag_
7、initrdinitrd;structtag_serialnrserialnr;structtag_revisionrevision;structtag_videolfbvideolfb;structtag_cmdlinecmdline;structtag_acornacorn;structtag_memclkmemclk;}u;171};除了ATAG_CORE和ATAG_NONE之外,其他的参数标记还包括:ATAG_MEM,ATAG_COMDLINE和ATAG_INITRD2等。每个参数标记就代表一个参数结构体,由
8、各个参数结构体构成了标记列表。在网蜂提供的U-Boot的源码中arch/arm/lib/bootm.c文件中有以下代码,说明参数是如何传递的。staticvoidsetup_start_tag(bd_t*bd){/*参数存放地址*/params=(structtag*)bd->bi_boot_params;/*标记ATAG_CORE开始*/pa
此文档下载收益归作者所有