嵌入式linux启动过程?嵌入式linux启动信息完全注释

本篇文章给大家谈谈嵌入式linux启动过程,以及嵌入式linux启动信息完全注释对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

嵌入式linux系统的启动流程是什么样的

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

中去执行。

嵌入式linux的bootloader的启动流程是怎样的

嵌入式 Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader), Linux内核,文件系统,应用程序。

当系统首次引导时,或系统被重置时,处理器会执行一个位于Flash/ROM中的已知位置处的代码,Bootloader就是这第一段代码。它主要用来初始化处理器及外设,然后调用 Linux内核。Linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(Root Filesystem),然后加载必要的内核模块,启动应用程序。这就是嵌入式Linux系统启动过程 Linux引导的整个过程。

Bootloader的启动方式:

网络启动方式。这种方式的开发板不需要较大的存储介质,跟无盘工作站有点类似,但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置IP地址。

硬盘启动方式

传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并使用磁盘作为存储介质。Linux传统上是LILO(Linux Loader)引导,后来又出现了GUN的软件(Grand Unified Bootloader)。这两种Bootloader广泛应用在X86的Linux系统上。

Flash启动方式。大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NOR Flash、NAND Flash和其它半导体盘。它们之间的不同在于: NOR Flash支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而NAND Flash并不支持XIP,所以要想执行 NAND Flash上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM中去执行。NOR Flash使用最为普遍。Bootloader一般放在Flash的底端或者顶端,这需要根据处理器的复位向量来进行设置。可以配置成MTD设备来访问Flash分区。

嵌入式linux系统开发的具体步骤

第一步、建立交叉编译环境

没有交叉开发经验的读者,可能一时很难接受这个概念。首先,要明白两个概念:一般

我们工作的机器,称为开发机、主机;我们制作好的系统将要放到某台机器,如手机或另一

台PC机,这台机我们称为目标主机。

我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它

们来写程序,那么,那什么又是交叉编译环境呢?其实一点也不神秘,也就是在开发机上再

安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,

是放在目标主机上运行的。

那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?至少我当

初是这么想的。一般来说,我们的开发机都是X86平台,原生开发套件开发的工具,也针

对X86平台,而我们的目标主机可能是PowerPC、IXP、MIPS……所以,我们的交叉编译

环境是针对某一类具体平台的。

一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌入式开发常用的

这三类软件是:

Binutils

Gcc

uClibc

当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择

第二步、编译内核

开发工具是针对某一类硬件平台,内核同样也是。这一步,我们需要用第一步中建立的

工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;

第三步、建立根文件系统

也就是建立我们平常看到的bin、dev、proc……这一大堆目录,以及一些必备的文件;

另外,我们还需要为我们的目标系统安装一些常用的工具软件,如ls、ifconfig……当然,

一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一

是数量多,二是某些体积较大,不适合嵌入式系统,这一步,我们一般都是用busybox来完

成的,包括系统引导软件init;

最后,我们为系统还需要建立初始化的引导文件,如inittab……

阅读剩余
THE END