教材学习内容总结
本周的学习目标是,学习和掌握Bootloader启动原理并且掌握Bootloader的移植和编译过程。首先学习了安装arm-linux-gcc交叉编译工具,解压缩交叉编译工具源码,然后测arm-linux-gcc是否可运行,发现报错,主要原因是当前系统环境是x86_64位,而arm-linux-gcc是32位,需要解决64位系统下安装32位软件的问题。输入
后再次测试arm-linux-gcc是否可运行,提示arm-linux-gcc:no input files,说明该文件在当前环境下可用。然后将将arm-linxu-gcc加入环境变量PATH中,然后进行下一步获取u-boot源码,建立板级支持包,最后编译U-Boot。
一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader), Linux 内核,文件系统,应用程序。
当系统首次引导时,或系统被重置时,处理器会执行一个位于Flash/ROM中的已知位置处的代码,Bootloader就是这第一段代码。它主要用来初始化处理器及外设,然后调用 Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统,然后加载必要的内核模块,启动应用程序。这就是嵌入式Linux系统启动过程。
根文件系统是 Linux 系统的核心组成部分,它可以作为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。
从以上分析可以看出 Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。
Bootloader 和 Linux 内核在嵌入式系统中的关系和作用。
1.Bootloader基本概述
Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的 BIOS。Bootloader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的Bootloader是很困难的,但为了能达到启动Linux 内核的目的,所有的 Bootloader都必须具备以下功能:
1) 初始化 RAM
因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 Bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。
2) 初始化串口端口
在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是 Bootloader 必须要完成的工作,但是通过串口输出信息是调试 Bootloader 和Linux 内核的强有力的工具,所以一般的 Bootloader 都会在执行过程中初始化一个串口作为调试端口。
3) 检测处理器类型
Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。
4) 设置 Linux启动参数
Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。
5) 调用 Linux内核映像
Bootloader完成的最后一项工作便是调用 Linux内核。如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。但由于在 Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将 Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行。
2.Bootloader启动过程
嵌入式Linux系统通过Bootloader引导,一上电,就要执行Bootloader来初始化系统。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。Bootloader 和 Linux 内核有着密不可分的联系。
Bootloader多数有两个阶段的启动过程:
1:基本的硬件初始化
为加载stage2准备RAM空间
拷贝内核映像和文件系统映像到RAM中
设置堆栈指针sp
跳到2的入口点
2:初始化本阶段要使用到的硬件设备
检测系统的内存映射
加载内核映像和文件系统映像
设置内核的启动参数
3.Bootloader 的启动方式
(1)网络启动方式
(2)硬盘启动方式
(3)Flash启动方式
在课堂上学习中的截图。
在实验楼的任务截图。
教材学习中的问题和解决过程
在本周的学习中,我学会了安装arm-linux-gcc交叉编译工具,了解并掌握了Bootloader启动原理和bootloader的配置、移植和编译,实现了编译U-Boot。在学习的过程中,测试arm-linux-gcc是否可运行的时候,出现了问题,检查了之前的代码,发现打了错误的代码,在修改了代码之后,问题解决了。在学习过程中,按照实验过程,解决了64位系统下安装32位软件的问题。在将arm-linxu-gcc加入环境变量PATH中时也出现了一个小错误,在检查了代码之后,解决了问题。在整个的学习过程中,知道了要擅于灵活使用tap键,并且要掌握快捷键的使用,会给我们的学习提供很多方便。