嵌入式Linux开发——(九)移植u-boot

1、Bootloader简介

    ①Bootloader是这么一小段程序,它在系统上电时开始执行,初始化硬件设备,准备好软件环境,最后调用操作系统内核。

    ②Bootloader的实现非常依赖于具体硬件,在嵌入式硬件配置中千差万别,即使是相同的CPU,它的外设也可能不同,所以不          可能有一个Bootloader支持所有的CPU电路板。

    ③CPU上电后,会从某个地址开始执行,ARM架构的CPU会从0x00000000开始,需要把存储器件ROM或Flash等映射到这个          地址上。

    ④Bootloader的两种操作模式:

        A、启动加载模式(Boot Loading)

            上电后,Bootloader从板子的某个固态存储上将操作系统加载到RAM中运行,整个过程没有用户介入。

        B、下载模式(Downloading)

            该模式下,开发人员可使用各类命令,通过串口或网络从主机下载文件,将它们直接放在内存中运行或烧写入Flash类存储             设备中。

2、Bootloader结构和启动过程

    ①嵌入式LInux系统从软件角度分为4个层次:

        A、引导加载文件

        包括在固件(Firmware)中的boot代码和Bootloader两部分。

        在X86中先运行BIOS中的固件,再运行Bootloader,而大多数嵌入式系统没有固件。

       B、Linux内核

       C、文件系统:包含了Linux系统能够运行的所有必备的应用程序、库等。

       D、用户应用程序

Bootloader

Boot parameters

(IP地址、波特率等)

Kernel

Root filesystem

    ②Bootloader的两个阶段

        A、第一阶段:(使用汇编来实现)

          1、硬件设备初始化:关闭WATCHDOG、关闭中断、设置时钟、初始化内存控制器等。

          2、加载Bootloader第二阶段准备RAM空间。

          3、复制Bootloader的第二阶段代码到RAM中。

          4、设置栈。

          5、跳转到第二阶段的C入口。

       B、第二阶段(使用C语言来实现)

          1、初始化本阶段使用到的硬件设备。

          2、检测系统内存映射:确定板上使用了多少内存,它们的地址空间是什么。

          3、将内核映象和根文件系统映象从Flash读到RAM中。

          4、为内核设置启动参数。

          5、调用内核。

    ③Bootloader与内核的互动

        A、两者交互是单向的,由于它们不能同时运行,Bootloader将参数放在某个约定的地方之后,再启动内核,内核启动后从                 这个地方获取参数。

        B、除了约定好参数地址外,还规定了参数的结构,Linux2.4.x以后的内核都期望以标记列表(tagged list)形式传递参数,                标记是一种数据结构,标记列表是挨着存放的多个标记,以ATAG_CORE开始,以ATAG_NONE结束。

         C、标记的数据结构为tag,它由一个tag_header(标记类型和长度)结构和一个联合(union)组成,不同类型有不同类型                的联合(union),比如tag_men32(内存)、tag_cmdline(命令行)。

猜你喜欢

转载自blog.csdn.net/qq_38677310/article/details/82532668