概述
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大多采用两阶段,即启动过程可以分为stage1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2.
BootLoader的stage 1 通常包括以下步骤:
1.硬件设备初始化(初始化CPU内部的硬件)
2.为加载BootLoader的stage2准备RAM空间
3.拷贝BootLoader的stage2到RAM空间中
4.设置好堆栈(分配动态内存用堆,运行C需要栈还有参数传递)
5.跳转到stage2的C入口点
BootLoader的stage 2通常包括以下步骤:
1.初始化本阶段要使用到的硬件设备(初始化板载的硬件)
2.将内核映像和根文件系统映像从flash上读到RAM中(速度不一样)
3.调用内核
U-boot是德国DENX小组开发的用于多种嵌入式CPU(MIPS、x86、ARM、XScale)的BootLoader程序。U-boot不仅支持嵌入式Linux系统的引导,还支持VxWorks,QNX等多种嵌入式操作系统。
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 12:34:56:78:9A:BC
Uboot>setenv ipaddr 192.168.1.1
Uboot>setenv serverip 192.168.1.254(tftp服务器的地址)
Ping
Uboot>tftp 32000000 uImage(把server(IP=环境变量中设置的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命令向Nor型Flash写入数据之前必须先使用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
最后
以上就是儒雅眼神为你收集整理的bootloader的全部内容,希望文章能够帮你解决bootloader所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复