嵌入式Linux作业Bootloader

发布 2022-09-20 17:59:28 阅读 8491

引入:对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式linux系统同样离不开引导程序,这个引导程序就叫做bootloader。

对比:回忆一下pc的体系结构我们可以知道,pc机中的引导加载程序由bios(其本质就是一段固件程序)和位于硬盘mbr中的引导程序一起组成。

bios在完成硬件检测和资源分配后,将硬盘mbr中的引导程序读到系统的ram中,然后将控制权交给引导程序。

引导程序的主要运行任务就是将内核映象从硬盘上读到ram中然后跳转到内核的入点去运行,也即开始启动操作系统。

而在嵌入式系统中,通常并没有像bios那样的固件程序。

因此整个系统的加载启动任务就完全由bootloader来完成.

比如在一个基于arm7tdmi core的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行.而在这个地址处安排的通常就是系统的bootloader程序。

1.1bootloader的概念和功能。

bootloader是一段汇编**,存放在mbr中,它的主要作用就是将操作系统启动**读入内存。

从功能上看,bootloader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。

设置程序入口

建立异常中断向量表

初始化cpu(堆栈、寄存器、模式…)

初始化硬件设备(sdram、flash、串口…)

初始化目标板(数据搬移、flash擦除和编程…)

引导和加载内核镜像

升级)支持开发和调试。从这个层面上看,

功能扩展后bootloader可以虚拟地看成是一个微小的系统级的**包。

1.2bootloader 的启动。

bootloader多数是两阶段的启动过程。

第一个启动阶段是和硬件平台相关的,大都采用汇编程序编写。

第二个启动阶段是和硬件平台无关的,大都采用c语言编写。

大多数bootloader都包含两种不同的操作模式:本地加载模式和远程**模式。

1.3 bootloader 的种类。

嵌入式系统世界已经有各种各样的bootloader,种类划分的方法也不是唯一的。

一般可以按照它所支持处理器体系结构不同进行划分。

armboot是一个arm平台的开源固件项目,它基于ppcboot,已经与ppcboot 项目合并,新的项目为u-boot。

armboot支持的处理器构架有strongarm、arm720t和pxa250 等

armboot的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。

armboot是gpl下的arm固件项目中唯一支持flash闪存、bootp、dhcp和tftp网络**

2.2u-boot

u-boot支持的处理器构架包括powerpc , arm ,mips,x86

u-boot的功能强大,涵盖了绝大部分处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、脚本和引导等工具

u-boot可配置性非常强 ,它所支持的命令也可以通过配置来增减。u-boot的命令主要包括以下几类:信息类命令、环境变量类命令、存储器命令、flash专用命令、载类命令、启动类命令和cache类命令,2.

3blob

blob(boot loader object)是由jan-derk bakker和erik mouw发布的,是专门为strongarm 构架下的lart设计的boot loader。

blob功能比较齐全,**较少,比较适合做修改移植,用来引导linux,目前大部分s3c44b0板都用移植的blob来加载uclinux。

1. 对嵌入式系统进行硬件分析, 掌握平台的资源信息。如:flash 的类型,容量,地址;sdram 的容量,地址等

2. 在u-boot中添加目标平台。

在$(uboot-srctree)/makefile 中添加与目标平台相对应的编译目标

example:

edb9315a_configunconfig

echo "#define config_ep9315a" >include/

echo "#define config_edb9315a"

>include/

mkconfig) $config=) edb93xx arm arm920t

edb93xx cirrus ep93xx

sed -i "s,^text_base = text_base =

0xc54f0000,g" $obj)board/cirrus/edb93xx/

echo ".configured for cirrus logic edb9315a board"

make edb9315a_config 后的结果: mkconfig

include/asm include/asm-arm

include/asm/arch include/asm-arm/arch-ep93xx

生成 : incude

3. 添加平台相关的**及配置文件

1) cpu/arm920t

这部分**对处理器及硬件平台最小系统进行初始化工作, 包括使初始化processor工作模式初始化timer,设置pll, 关闭 watchdog, disable interrupt, disable mmu and cache, 初始化 memory controller,设置堆栈指针, uboot binary image reallocattion, 初始化bss段

lowlevel_

这些工作相当于boot loader 的stage1, 完成这部分工作后就会跳转到stage2 ,2) cpu\arm920t\ep93xx

这部分**主要是片上基本外设的驱动**, 包括:uart , timer, pll, i2c, usb host等, 其中uart, timer, pll 是最基本的外设。 在uboot中一般都会定义标准的设备驱动接口, 如 uart

serial_init()

serial_setbrg()

serial_getc()

serial_tstc()

serial_putc()

serial_puts()

3) board\edb93xx

这部分**主要完成两部分工作: 一部分为平台sdram的初始化**; 另外一部分就是stage 2 阶段针对硬件平台进行初始化及驱动的**。

board_init()

dram_init()

flash_init()

) nic驱动

u-boot中对于网卡的驱动也是有标准接口的。

eth_init()

eth_halt()

eth_rx()

eth_send()

5) platform 配置文件--include\configs\

所有的配置文件位于include\configs 目录下该文件中包含了所有与平台相关的配置信息:如:

处理器类型;

平台存储器物理起始地址,长度

串口参数 网卡参数

环境变量参数

6)传递给linux的tag

config_setup_memory_tags

config_cmdline_tag

config_initrd_tag

7)u-boot linux内核映像:

mkimage -a arm -o linux -t kernel -c gzip -a 0xc0080000 -e

0xc0080000 -n "linux kernel" -d $/

mkimage -a arm -o linux -t ramdisk -c gzip -a 0xc4000000 -e

0xc4000000 -n "linux ramdisk" -d $/

嵌入式linux

设备的驱动程序和应用程序的区别 1应用程序以main开始,驱动程序没有main,它的一个模块初始化函数作为入口。2应用程序从头到尾执行一个任务,驱动程序完成初始化后不再运行,等待系统调用。3应用程序可以使用c函数库,驱动程序不能使用。普通和预定义变量有什么区别 自定义变量的值由用户自行设定,而预定义...

嵌入式linux与嵌入式系统设计

ustc bbs embedded斑竹d j主讲。感谢hongtao chen以及networking斑竹jun zxjun的大量幕后工作!感谢james zhang以及网络中心提供聚会的场地和大力支持!欢迎访问我的主页。聚会详情如下 名称 嵌入式系统设计以及嵌入式linux展望 时间 本周星期天 ...

《嵌入式系统与开发》构建嵌入式Linux系统 实验报告

嵌入式qt编程设计 实验报告。学生姓名。学号。专业班级。指导教师。完成时间。实验4 嵌入式qt编程及使用。一。实验目的。理解qt信号和插槽机制,掌握利用qt creator进行图形软件设计的基本步骤,并掌握将编译好的可执行程序加载到嵌入式开发板并运行的方法。掌握qt应用程序操纵底层硬件设备的基本步骤...