引入:对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式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应用程序操纵底层硬件设备的基本步骤...