全部博文(33)
分类: LINUX
2007-12-16 07:59:38
想成为嵌入式软件工程师,总得把firmware、bootloader、OS以及芯片的体系结构作个较全面的了解。正是基于这种想法,在熟悉了51和ARM结构及其平台下的编程之后,便要来研究bootloader。
所谓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工具,每一个都需要专门研究,得慢慢来。