bootloader

Bootloader

一个嵌入式系统从软件角度来看分为三个层次:

1.引导加载程序 (包括固化在固件中的boot程序(可选),和bootloader 两大部分)

2.Linux内核 

3.文件系统(包括了系统命令和应用程序)

一个同时装有BootLoader 、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图:

Bootloader——boot parameters ——kernel ——root filesystem

 

引导程序的主要任务是将内核从硬盘上读到内存中,然后跳到内核的入口点去运行,即启动操作系统。

 

简单地说,BootLoader 就是在操作系统运行之前运行的一段小程序,通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。

在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。

系统加电或复位后,所用的CPU通常都从CPU制造商预先安排地址开始执行。比如S3C2410在复位后从地址0x00000000起开始执行。而嵌入式系统则将固态存储设备(比如:FLASH)安排在这个地址上,而BootLoader程序又安排在固态存储器的最前端,这样就又能保证在系统加电后,CPU首先执行BootLoader程序。

 

BootLoader大多采用两阶段,即启动过程可以分为stage1stage2stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2.

 

BootLoaderstage 1 通常包括以下步骤:

1.硬件设备初始化(初始化CPU内部的硬件)

2.为加载BootLoaderstage2准备RAM空间

3.拷贝BootLoaderstage2RAM空间中

4.设置好堆栈(分配动态内存用堆,运行C需要栈还有参数传递)

5.跳转到stage2C入口点

BootLoaderstage 2通常包括以下步骤:

1.初始化本阶段要使用到的硬件设备(初始化板载的硬件)

2.将内核映像和根文件系统映像从flash上读到RAM中(速度不一样)

3.调用内核

 

U-boot是德国DENX小组开发的用于多种嵌入式CPUMIPSx86ARMXScale)的BootLoader程序。U-boot不仅支持嵌入式Linux系统的引导,还支持VxWorksQNX等多种嵌入式操作系统。

 

U-boot.bin的生成也分为两步,以mini2440为例来说明,如下(未经移植的u-boot并不支mini2440):

移植U-boot的基本步骤如下:

1.在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例

Smdk2410_config : unconfig

     @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

参考上面2行,添加下面2行:

mini2410_config : unconfig

     @./mkconfig $(@:_config=) arm arm920t mini2410 NULL s3c24x0

arm:     CPU架构

arm920t: CPU类型 (对应cpu/arm920t目录)

mini2440: 开发板型号(对应board/mini2440目录)

NULL:     开发者

Ss3c24x0:  片上系统(SOC

 

2.在board目录中创建一个属于新开发板的目录,向目录中添加文件,并修改:

mkdir -p board/mini2440

cp -rf board/smdk2410/* board/mini2410

 

3.为开发板添加新的配置文件,先复制参考开发板的配置文件,再修改。例如:

cp include/configs/smdk2410.h include/configs/mini2440.h

 

4.选择要使用的board(先清除make distclean)

$make mini2440_config(目标,在Makefile中可以查到)

 

5.编译生成u-boot.bin

$make CROSS_COMPILE=arm-linux-(指定交叉 工具链)

 

U-boot提供了丰富的命令集help命令可用于查看当前单板所支持的命令。

Printenv:查看环境变量

setenv:添加(setenv 变量名 值)、修改(setenv 变量名 值)、删除(setenv 变量名)环境变量

Saveenv 保存环境变量(设置环境变量时保存在内存中,掉电丢失,所以要保存在FLASH中)

Tftp 通过网络下载文件

Uboot>setenv ethaddr 123456789ABC

Uboot>setenv ipaddr 192.168.1.1

Uboot>setenv serverip 192.168.1.254(tftp服务器的地址)

Ping

Uboot>tftp 32000000 uImage(serverIP=环境变量中设置的serverip)中服务目录下的uImage通过TFTP读到0x32000000)

 

md 显示内存区的内容

md 32000000(起始地址 //四个字节显示

md [.b,.w,.l] address 如:md.b 32000000

 

mm 修改内存,地址自动递增(结束:空格+回车)

mm [.b,.w,.l] address 

 

flinfo 查看flash扇区信息

 

protect Flash (写保护)    // 打开或关闭扇区的写保护

用法:

protect off all 关闭所有扇区的写保护

protect on all 打开说有扇区的写保护

protect off start end 关闭从Start end扇区的写保护(Start为要关闭的第一个扇区的起始地址,end为要关闭的最后一个扇区的结束地址)

protect on start end 打开从Start end扇区的写保护

 

erase 擦除flash扇区

用法:erase start end

擦除从start end扇区的扇区(Start为要擦除的第一个扇区的起始地址,end为要擦除的最后一个扇区的结束地址)

在使用cp命令向NorFlash写入数据之前必须先使用erase命令擦除flash,因为norflash按字节写入时,无法写入1,所以必须通过擦除来写入1

 

cp 数据拷贝

cp [.b,.w,.l] saddress daddress len

cp 提供了一种内存与内存,内存与Flash之间数据拷贝的方法。

go 执行内存中的二进制代码,一个简单的跳转指定地址指令

Bootm 执行内存中的二进制代码

 

bdinfo 显示开发板的信息

设置自动启动:

setenv bootcmd tftp 31000000 uImage \; bootm 31000000

saveenv 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值