linux之Bootloader了解概念和启动过程

Bootloader,简而言之就是:它是一段小程序,在系统上电时开始执行,主要功能是初始化硬件设备、准备好软件环境,最后调用操作系统内核。

 

Bootloader种类比较多,常见的X86上的有LILO,GRUB,ARM架构上比较有名的是U-boot,VIVI.  还有其他的RedBoot / Etherboot等

 

启动Bootloader指令地址(ARM结构的cpu一般放在0x0000000地址处,而MIPS结构的CPU一般放在0xBFC00000)

 

Bootloader常见两种操作模式:1。启动加载模式(没用户介入) 2.下载模式(用户命令操作)

 

Bootloader中典型分区结构图:

*Bootloader上电后第一个程序。

*Boot parameters分区中一般存放一些可设置的参数,比如IP地址、串口波特率,要传递给内核的命令行参数。

*kernel,嵌入式板定制的内核,包含内核启动参数

*Root filesystem文件系统,里面包含了linux能够运行的应用程序,和相关库等。

 

@Bootloader的两个阶段了解

1.第一阶段(使用汇编语言实现,依赖于cpu体系结构的初始化)

。硬件初始化(看门狗、RAM初始化等)

。为加载Bootloader的第二阶段代码准备RAM空间

。复制Bootloader的第二阶段代码到RAM空间中

。设置好栈

。调转到第二阶段代码的入口点

2.第二阶段(通常C语言实现,好处可读性和移植性)

。初始化本阶段要用到的硬件设备

。检测系统内存映射(memory map)

。将内核映像和根文件系统系统映像从Flash读到RAM内存中

。为内核设置启动参数

 

@Bootloader与内核交互

Bootloader和内核交互是单向的,因为它们启动有先后。

Bootloader传递参数给内核,有书说明:linux2.4.x后都是以数据结构:标记列表形式来传递启动参数。

标记的数据结构为tag,由tag_header结构和 一个联合union组成。如下:

 struct tag_header {
 __u32 size;
 __u32 tag;
};

struct tag_mem32 {
	__u32	size;
	__u32	start;	/* physical start address */
};
struct tag {
	struct tag_header hdr;
	union {
		struct tag_core		core;
		struct tag_mem32	mem;  //内存标记
		struct tag_videotext	videotext;
		struct tag_ramdisk	ramdisk;
		struct tag_initrd	initrd;
		struct tag_serialnr	serialnr;
		struct tag_revision	revision;
		struct tag_videolfb	videolfb;
		struct tag_cmdline	cmdline;

		/*
		 * Acorn specific
		 */
		struct tag_acorn	acorn;

		/*
		 * DC21285 specific
		 */
		struct tag_memclk	memclk;
	} u;
};


 

 

 

 

 

 

 

你可能感兴趣的:(数据结构,linux,struct,header,语言,Parameters)