目录
3.Bootlader 、Linux Kernel、 RootFile
6.Arm 从bootloader 、kernel到rootfs的启动流程
1.flash 分区
2.MTD 层级
参考资料:Linux MTD 介绍
3.Bootlader 、Linux Kernel、 RootFile
- 三者启动顺序:Bootloader---->Linux Kernel--->RootFile
后者需要前者提供功能支持,前者目的就是为了启动后者
2.嵌入式linux的bootloader启动流程
当系统首次引导时,或系统被重置时,处理器会执行一个位于Flash/ROM中的已知位置处的代码,Bootloader就是这第一段代码。它主要用来初始化处理器及外设,然后调用Linux内核。Linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(RootFilesystem),然后加载必要的内核模块,启动应用程序。这就是嵌入式Linux系统启动过程Linux引导的整个过程
(系统首次引导或者被重置)--->bootloader--->linux kernel--->rootfile--->(加载有必要的内核模块)->(启动应用程序)
- Bootloader在运行过程中虽具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动Linux内核
- RootFileSystem是Linux系统的核心组成部分,它可以作为Linux系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。文件系统全称叫文件管理系统,是linux系统用于在存储设备组织文件的方法。
- 应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义
4.详解Bootloader
Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于PC机上的BIOS。Bootloader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的Bootloader是很困难的,但为了能达到启动Linux内核的目的,所有的Bootloader都必须具备以下功能:
1.初始化RAM(Linux Kernel run in RAM,store in flash)
因为Linux内核一般都会在RAM中运行,所以在调用Linux内核之前Bootloader必须设置和初始化RAM,为调用Linux内核做好准备。初始化RAM的任务包括设置CPU的控制寄存器参数,以便能正常使用RAM以及检测RAM大小等。
- Bootloader基本概述
2. 初始化串口端口(To Debug)
在Linux的启动过程中有着非常重要的作用,它是Linux内核和用户交互的方式之一。Linux在启动过程中可以将信息通过串口输出,这样便可清楚的了解Linux的启动过程。虽然它并不是Bootloader必须要完成的工作,但是通过串口输出信息是调试Bootloader和Linux内核的强有力的工具,所以一般的Bootloader都会在执行过程中初始化一个串口作为调试端口。
3. 检测处理器类型(call different init program by different CPU )
Bootloader在调用Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给Linux内核。Linux内核在启动过程中会根据该处理器类型调用相应的初始化程序。
4.设置linux的启动参数
Bootloader在执行过程中必须设置和初始化Linux的内核启动参数。
5. 调用linux内核(启动kernel)
Bootloader完成的最后一项工作便是调用Linux内核。如果Linux内核存放在Flash中,并且可直接在上面运行(这里的Flash指NorFlash),那么可直接跳转到内核中去执行。但由于在Flash中执行代码会有种种限制,而且速度也远不及RAM快,所以一般的嵌入式系统都是将Linux内核拷贝到RAM中,然后跳转到RAM中去执行。
- Bootloader启动过程
嵌入式Linux系统通过Bootloader引导,一上电,就要执行Bootloader来初始化系统。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC等)中的Linux内核拷贝到RAM中去,然后跳转到内核的第一条指令处继续执行,从而启动Linux内核。Bootloader和Linux内核有着密不可分的联系。
Bootloader多数有两个阶段的启动过程:
Stage1:
基本的硬件初始化
为加载stage2准备RAM空间
拷贝内核映像和文件系统映像到RAM中
设置堆栈指针sp
跳到stage2的入口点
Stage2:
初始化本阶段要使用到的硬件设备
检测系统的内存映射
加载内核映像和文件系统映像
设置内核的启动参数
嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader
- Bootloader的启动方式
1.网络启动方式
这种方式的开发板不需要较大的存储介质,跟无盘工作站有点类似,但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置IP地址。
2.硬盘启动方式
传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并使用磁盘作为存储介质。Linux传统上是LILO(LinuxLoader)引导,后来又出现了GUN的软件(GrandUnifiedBootloader)。这两种Bootloader广泛应用在X86的Linux系统上。
3.Flash启动方式
大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NORFlash、NANDFlash和其它半导体盘。它们之间的不同在于:NORFlash支持芯片内执行(XIP,eXecuteInPlace),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而NANDFlash并不支持XIP,所以要想执行NANDFlash上的代码,必须先将其拷贝到RAM中去,然后跳到RAM中去执行。NORFlash使用最为普遍。Bootloader一般放在Flash的底端或者顶端,这需要根据处理器的复位向量来进行设置。可以配置成MTD设备来访问Flash分区
5.bootloader、kernel、文件系统相关问题
1.linux的内核是由bootloader装载到内存中的
提问:
参考书上写的内容bootloader的作用是加载内核并将控制权转交给内核程序,但是内核文件本身是存放在硬盘的文件系统中,bootloader只有512B,此时并没有能力识别文件系统和initrd,因此是如何在硬盘上定位内核文件的?
对于文件系统的一个疑问,以linux中的ext文件系统为例,文件是由超级块,inode,数据块组成的,要读取数据必须找到inode,从中取出文件是有哪些bloc块组成的,但是是谁记录inode的位置呢?是否跟硬盘的MBR一个原理?存在硬盘分区的前几个固定位置,然后调用系统中断来取?
回答:
linux的内核的确是由bootloader装载到内存中的。linux的bootloader有2个部分组成:bootstrap和uboot。所以更准确点的说法是:linux的内核是由uboot装载到内存中的。内核文件本身是存放在硬盘的文件系统中,这句话就是错的。内核和文件系统是分开存储的。uboot读取kernel到内存是从kernel开始存储的地址开始读取的,而读取开始位置和读取大小,是由环境变量决定的。所以这个时候不需要文件系统的。
2.请问bootloader、u-boot和linux内核的区别和关系是怎样的?
bootloader是取代mbr功能的,可以看成mbr的加强.u-boot是把usb盘做成启动盘的,linux内核就是linux系统的核心,你用的linux就是在内核基础上扩展了shell和应用程序.。
mbr=masterbootrecord,主引导记录,位置在磁盘的0磁道0柱面1扇区。bios启动会首先访问他,把启动交给mbr,mbr记录从哪个地方开始启动。
简介
MBR,全称为MasterBootRecord,即硬盘的主引导记录。
为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(DiskPartitiontable)和硬盘有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(bootloader)占446个字节,第二部分是Partitiontable区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magicnumber,占2个字节,固定为55AA。
3.为什么bootloader要去Flash上读入Linux内核
这个问题应该分为几个部分
1.bootloader主要是负责系统初始化和系统加载的嵌入式系统一般会把bootloader和系统内核分开存放,这样的话系统内核损坏了的话还可以通过bootloader进行恢复
2.linux内核一般比bootloader大很多。一个嵌入式系统,在系统刚通电的时候,根据cpu的不同,他们是从一个固定的内存地址开始运行的。一般情况下,这个固定地址会是一个ROM,其存储空间一般较小,一般用来存放bootloader。而根据板子设计的不同,系统内核是保持在flash或者其他存储介质上的。
3.bootloader在完成硬件初始化后,从存储介质上把系统内核读入到指定的内存区域,然后用一个跳转指令跳转到系统内核处开始执行。注意,这个存储介质不一定是flash
3.为什么需要BootLoader?linux
引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OSBootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OSBootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMIcore的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。
在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:
1、引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3、文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。
4、用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。
抄录资料:BootLoader、Linux Kernel(linux内核)、RootFile(根文件系统)