转自:http://hi.baidu.com/zhanghaooy/home
BootLoader是系统加电启运行的第一段软件代码.回忆一下PC的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程 序)和位于硬盘MBR中的引导程序一起组成。[color=red]BIOS在完成硬件检测和资源分配后,将硬盘MBR中的引导程序读到系统的RAM中,然后将控制权交给引导程 序。引导程序的主要运行任务就是将内核映象从硬盘上读到RAM中 然后跳转到内核的入口点去运行,也即开始启动操作系统。 [/color]
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(有的嵌入式系统也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 BootLoader来完成.比如在一个基于 ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址 0x00000000开始执行.而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射 图(有的CPU没有内存映射功能如 S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。
u BootLoader的安装
系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C44B0在复位的都从地址0x00000000取它的第一条指 令。而嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执 行BootLoader程序。也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引 导的固态存储设备如FLASH。
u 用来控制BootLoader的设备或机制
串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader程序在执行 时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为出口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在 BootLoader中就需要编写各自的驱动
u BootLoader的启动过程
多阶段的BootLoader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 BootLoader大多都是2阶段的启动过程,也即启动过程可以分为 stase1和stase 2两部分,具体功能将在下一节介绍。
u Boot Loader的操作模式
大多数BootLoader都包含两种不同的操作模式。“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为“自主”(Autonomous)模式,也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到 RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。因此在嵌入式产品发布的时候,BootLoader显然必须工 作在这种模式下.
下载(Down loading)模式:在这种模式下 目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等.从主机下载的文件通常首 先被BootLoader保存到目标机的RAM中然后再被BootLoader写到目标机上的固态存储设备中。BootLoader的这种模式通常在系统 更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。
在教学系统中提供的BootLoader中没有实现自主模式,可以通过修改代码来实现该功能。
u BootLoader与主机之间进行文件传输所用的通信设备及协议
最常见的情况就是,目标机上的BootLoader通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmode/ymode/zmode协议以及在以太网上采用TPTP协议。
此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和TFTP协议来下载文件时,主机方必须有一个软件用来提供TFTP服务。
所谓bootloader,个人理解它是以加载OS为目的。和PC一样,嵌入式系统的OS,同样要在RAM上运行,这有别于一般的单片机编程:程序直接在ROM中运行,只将变量、堆栈等放在RAM中。所以把代码从存储器拷贝到RAM中,变成了 bootloader的工作之一。
一般的,嵌入式系统的存储器以Flash应用最广,Flash分为两种:norFlash和 nandFlash,打个不 恰当的比方,norFlash相当于ROM,程序可以直接在其上运行,nandFlash相当于硬盘,只负责存储程序。所以一般的bootloader代 码都存储在norFlash中,上电后芯片可直接读取其上的代码来运行,而S3C2410芯片比较特别,以它为平台构建的系统可以用nandFlash来 储存bootloader。因为它自带了4K的RAM,上电后通过硬件机制将存储器中的前4K代码拷贝到芯片自身的RAM里。
现成的bootloader,其架构基本分为两个部分,第一部分用汇编编写,与芯片体系结构密 切相关,主要用于芯片的初始化、准备RAM空间以及加载第二部分C程序。以vivi bootloader用于S3C2410,并存储于nandFlash为例,arch/s3c2410/head.s便是其第一部分,用汇编编写,实现基 本的初始化以及代码搬迁(从nandFlash拷贝到RAM),然后跳转到RAM里执行C程序;第二部分完全用C实现,完成目标板初始化和OS的加载,也 可以直接在其上运行应用程序。当然还不止这些,第二部分还集成了很多命令,用于调试和下载等功能。具体的细节可以阅读其源码,推荐用windows下 SourceInsight或Linux下LXR阅读,按照程序运行的顺序一步步来读,只要有C语言基础,读懂是没问题的。
剩下的就是代码的组织、编译,包括Makefile文件,Makefile文件是一个大问题,像普通的编程语言一样,有自己的一套规则,另外还设计到编译汇编工具:Gcc、as、ld等,这些都是GNU工具,每一个都需要专门研究,得慢慢来。
BootLoader是系统加电启运行的第一段软件代码.回忆一下PC的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程 序)和位于硬盘MBR中的引导程序一起组成。[color=red]BIOS在完成硬件检测和资源分配后,将硬盘MBR中的引导程序读到系统的RAM中,然后将控制权交给引导程 序。引导程序的主要运行任务就是将内核映象从硬盘上读到RAM中 然后跳转到内核的入口点去运行,也即开始启动操作系统。 [/color]
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(有的嵌入式系统也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 BootLoader来完成.比如在一个基于 ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址 0x00000000开始执行.而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射 图(有的CPU没有内存映射功能如 S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。
u BootLoader的安装
系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。比如,S3C44B0在复位的都从地址0x00000000取它的第一条指 令。而嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被安排这个起始地址上,因此在系统加电后,CPU将首先执 行BootLoader程序。也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引 导的固态存储设备如FLASH。
u 用来控制BootLoader的设备或机制
串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader程序在执行 时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为出口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在 BootLoader中就需要编写各自的驱动
u BootLoader的启动过程
多阶段的BootLoader能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 BootLoader大多都是2阶段的启动过程,也即启动过程可以分为 stase1和stase 2两部分,具体功能将在下一节介绍。
u Boot Loader的操作模式
大多数BootLoader都包含两种不同的操作模式。“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为“自主”(Autonomous)模式,也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到 RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式。因此在嵌入式产品发布的时候,BootLoader显然必须工 作在这种模式下.
下载(Down loading)模式:在这种模式下 目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等.从主机下载的文件通常首 先被BootLoader保存到目标机的RAM中然后再被BootLoader写到目标机上的固态存储设备中。BootLoader的这种模式通常在系统 更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。
在教学系统中提供的BootLoader中没有实现自主模式,可以通过修改代码来实现该功能。
u BootLoader与主机之间进行文件传输所用的通信设备及协议
最常见的情况就是,目标机上的BootLoader通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmode/ymode/zmode协议以及在以太网上采用TPTP协议。
此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和TFTP协议来下载文件时,主机方必须有一个软件用来提供TFTP服务。
所谓bootloader,个人理解它是以加载OS为目的。和PC一样,嵌入式系统的OS,同样要在RAM上运行,这有别于一般的单片机编程:程序直接在ROM中运行,只将变量、堆栈等放在RAM中。所以把代码从存储器拷贝到RAM中,变成了 bootloader的工作之一。
一般的,嵌入式系统的存储器以Flash应用最广,Flash分为两种:norFlash和 nandFlash,打个不 恰当的比方,norFlash相当于ROM,程序可以直接在其上运行,nandFlash相当于硬盘,只负责存储程序。所以一般的bootloader代 码都存储在norFlash中,上电后芯片可直接读取其上的代码来运行,而S3C2410芯片比较特别,以它为平台构建的系统可以用nandFlash来 储存bootloader。因为它自带了4K的RAM,上电后通过硬件机制将存储器中的前4K代码拷贝到芯片自身的RAM里。
现成的bootloader,其架构基本分为两个部分,第一部分用汇编编写,与芯片体系结构密 切相关,主要用于芯片的初始化、准备RAM空间以及加载第二部分C程序。以vivi bootloader用于S3C2410,并存储于nandFlash为例,arch/s3c2410/head.s便是其第一部分,用汇编编写,实现基 本的初始化以及代码搬迁(从nandFlash拷贝到RAM),然后跳转到RAM里执行C程序;第二部分完全用C实现,完成目标板初始化和OS的加载,也 可以直接在其上运行应用程序。当然还不止这些,第二部分还集成了很多命令,用于调试和下载等功能。具体的细节可以阅读其源码,推荐用windows下 SourceInsight或Linux下LXR阅读,按照程序运行的顺序一步步来读,只要有C语言基础,读懂是没问题的。
剩下的就是代码的组织、编译,包括Makefile文件,Makefile文件是一个大问题,像普通的编程语言一样,有自己的一套规则,另外还设计到编译汇编工具:Gcc、as、ld等,这些都是GNU工具,每一个都需要专门研究,得慢慢来。