bootloader浅析

bootloader浅析

背景
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:
1、 引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3、 文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。
4、 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。
一个嵌入式的存储设备通常包括四个分区:
第一分区:存放的当然是u-boot
第二个分区:存放着u-boot要传给系统内核的参数
第三个分区:是系统内核(kernel)
第四个分区:则是根文件系统。
存储设备分区
Bootloader定义
Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。具体在Bootloader中完成了哪些操作我们会在后面分析到,这里我们先来回忆一下PC的体系结构:PC机中的引导加载程序是由BIOS和位于硬盘MBR中的OS Boot Loader(比如LILO和GRUB等)一起组成的,BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注:有的嵌入式cpu也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。
U-boot
常见的bootloader有:Redboot,ARMboot,U-Boot,Blob等,其中U-boot,全称Universal Boot Loader,是由DENX小组的开发的遵循GPL条款的开放源码项目,它的主要功能是完成硬件设备初始化、操作系统代码搬运,并提供一个控制台及一个指令集在操作系统运行前操控硬件设备。U-boot之所以这么通用,原因是他具有很多特点:开放源代码、支持多种嵌入式操作系统内核、支持多种处理器系列、较高的稳定性、高度灵活的功能设置、丰富的设备驱动源码以及较为丰富的开发调试文档与强大的网络技术支持。
U-Boot源代码下载地址
免费下载地址在 http://linux.linuxidc.com/具体下载目录在 /pub/u-boot/
用户名与密码都是www.linuxidc.com
uboot官网:http://www.denx.de/wiki/U-Boot/WebHome
飞思卡尔的芯片有自己的uboot源码及编译工程可供免费下载;

U-Boot—kernel
以飞思卡尔的imx6q为例:
烧录入板子的文件有三个:
uboot.bin; //由单独的工程生成
boot.img; //实际==kernel + ramdisk + cmdline;
system.img; //文件系统,与boot.img一起生成
其中cmdline来源于:M~~4.3_android/device/Q~i~s/q~i~s/BoardConfig.mk,

BOARD_KERNEL_CMDLINE := console=ttymxc0,115200 init=/init ~~~~~~~ androidboot.console=ttymxc0 androidboot.hardware=freescale  bluetooth

uboot通过解析BOARD_KERNEL_CMDLINE,setenv,生成bootargs传递给kernel。

Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给kernel,也可以kernel强制使用自己的cmdline。
1、kernel若是采用uboot传递的cmdline,需要M~~4.3_android/kernel_imx/arch/arm/configs/imx6_android_eng_defconfig下的

#CONFIG_CMDLINE_FORCE is not set

2、kernel强制使用自己的cmdline,需要M636_JB4.3_android/kernel_imx/arch/arm/configs/imx6_android_eng_defconfig下的

CONFIG_CMDLINE="console=ttymxc0,115200 video=mxcfb0:dev=lcd,lcd_640x480_2,if=RGB24,bpp=32 video=mxcfb1:ldb,LDB-8PLCD if=RGB24,bpp=32 video=mxcfb2:off fbmem=30M vmalloc=400M init=/init androidboot.console=ttymxc0 androidboot.hardware=freescale ldo_active=off"
# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
# CONFIG_CMDLINE_EXTEND is not set
CONFIG_CMDLINE_FORCE=y               //强制使用自己的cmdline

运行时进入uboot的方式是运行到如下时敲回车键或者其他键,就会进入uboot,

##### PAD6_DDR_VERSION_ISSI_1G #####
Net:   got MAC address from IIM: 00:00:00:00:00:00
FEC0 [PRIME]
Hit any key to stop autoboot:  0 

可以输入help查看支持的指令,若想继续引导,可以输入boot kernel指令。

参考:http://www.360doc.com/content/12/0913/12/9072830_235879252.shtml

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值