翻译原文来自:https://www.rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide

核心概念和引导流程

每个基于Altera SoC FPGA的嵌入式Linux设计都将遵循类似的启动过程。在深入研究每个步骤之前先对流程中的每个步骤是什么有一个小小的了解是很有必要的。这里节选第二次Altera SoC FPGA 研讨会的PPT内容来阐述和总结启动流程:

 如上所示,第一个运行的软件是Boot ROM,然后加载Preloader,然后加载U-boot,然后加载Linux。这个图被称为“boot flow”,对于大多数嵌入式Linux设计在Cyclone V SoC和Arria V SoC上都是基于这种模式,应该不会有太大的偏差。

preloader、u-boot和Linux的二进制文件可以放在许多不同类型的非易失性存储设备(QSPI闪存、SD卡等)上。要知道preloader(引导过程中的第二阶段)位于何处,电路板设计人员需要设置BSEL(引导选择)引脚。在Atlas板上,这些引脚已经硬编码成了某个配置,该配置告诉Boot ROM要在SD卡上查找preloader。如果您使用的是不同的电路板,请查阅Cyclone V技术参考手册,了解设置BSEL引脚的信息。在本指南的后面,您将学习如何对microSD卡进行分区,以便Boot ROM可以访问它。

(翻译该文章的时候我个人总结了BSEL 的配置,请参考https://www.cnblogs.com/DoreenLiu/p/15727486.html )

简化的Linux内核引导流程

尽管这张图很好地解释了Linux启动的底层细节,但您可能想知道Linux启动后会发生什么?你可能会思忖:“除了几个指向色彩稀疏的盒子的箭头之外,肯定还有别的吧?”对此,我的回答是:“是的,你是对的!”

当Linux内核启动时,它首先执行许多低级体系结构特定的初始化序列(设置处理器寄存器、内存管理单元、中断控制器等)。然后尽可能早地加载一个串口驱动程序,这样它就可以输出调试消息,帮助开发人员定位引导流程boot flow中的前面四个步骤的问题。

之后,它开始初始化编译到内核中的所有内核子系统和驱动程序(当您编译内核时,您可以选择哪些要添加进内核,哪些不要)。最后,它尝试挂载“根文件系统”。这个文件系统包含您的shell和您想要运行的所有程序。

如果内核能够挂载您的根文件系统(您会记得为您正在使用的文件系统编译驱动程序,对吗?),那么它将尝试运行“/sbin/init”程序。这是在用户空间运行的第一个程序。这也是启动所有其他程序的程序。这里有许多不同的初始化程序(systemd, upstart, SysVinit等),在本指南中我们将使用一个了不起的软件集合(名为BusyBox,是专门针对嵌入式系统设计的工具)所提供的初始化系统(这些都在后文的“生成根文件系统”一节中进行了解释)。

下面这张来自Free Electrons’ Embedded Linux开发课程的PPT很好地总结了这一点:

 

一旦Linux系统完全启动并且出现登录提示符,您就可以开始调整嵌入式Linux系统,以适应特定应用程序的需要。如果您需要支持网络,那么您可能应该为其增加一些网络管理软件,并编写一个在启动时运行的脚本来初始化所有内容。想要图片吗?也许可以加入一个帧缓冲设备和一些库,使创建图形应用程序更容易。

在本指南的最后,您将拥有一个功能齐全(尽管是最小)的嵌入式Linux发行版,然后您可以对其进行定制,以满足特定应用程序的需求。继续下一节,了解如何创建预加载器preloader。

资源

Free Electron’s course on Embedded Linux Development

Free electronics在本次培训中出色地解释了嵌入式Linux开发的各个方面。绝对推荐阅读,以了解更多关于嵌入式Linux的一般概念。

Altera SoC Workshop #2

这个研讨会很好地解释了嵌入式Linux开发中许多特定于SoC的方面。如果你不太了解你的SoC,就从浏览这些幻灯片开始吧。

Altera Application note on the HPS Boot Flow

另一个关于学习芯片启动方式的官方资源。