标签:启动引导 资源紧缺型系统 资源宽裕型系统 bootloader 固件打包
通过前面嵌入式启动方式的学习,再来理解嵌入式应用程序的三种加载方式是比较容易的。一般意义上,启动是为了引导OS到内存,而应用程序则是操作系统run起来后的用户选择,两者是比较相似的。先根据启动的两种方式来介绍应用程序的加载。
1. 对于资源有限型的嵌入式系统,应用程序在编译、链接之后,会通过二进制工具分析可执行文件的格式,抽出code和data段数据,生成.HEX格式或者.BIN格式,下载到SOC内置的flash中。在上电之后就直接执行了。这种加载方式称为离线加载。
2. 对于资源宽裕型的嵌入式系统,应用程序在编译、链接之后生成一个可执行文件,如elf或者exe,放到一个文件目录。这个文件目录是受用户文件系统管理的,如linux系统的ext4文件系统,或者windows的NTFS、FAT32文件系统等等。以linux系统为例说明:
1)CD到可执行文件所在的目录,假如可执行文件时b.elf,那执行过程是./b.elf
2)fork一个子进程
3)在子进程中execve("b.elf")。其做的工作就是通过ext4文件的fsopen函数找到a.elf这个文件,然后解释其ELF格式,在创建好页表后,将code段和data段搬到内存,初始化bss段,最后跳到entry所在的地方。
这种加载过程是在线加载。
3. 还存在一种这样的嵌入式系统架构,SOC的计算能力比较弱,但内存资源在百K级别,其能支持简单的操作系统,例如UCOS,而其一般没有外挂SDRAM,但其会将代码存放在外置的存储设备中,如nand和card,MP3、U盘就是这种嵌入式系统架构的最典型应用。MP3一般支持音乐、图片、电子书等等应用,代码量比较大,不适宜放到内置flash中,所以放到外置存储中。其成本敏感,内存要控制到最小,所以很多时候要对固件进行优化。那么它的应用程序的加载过程如何呢?
1)应用程序编译、链接之后生成可执行文件,可执行文件格式一般比较复杂。通过二进制工具将code、data和entry、bss等信息重新组成一个简单的文件,这样操作系统在加载这个文件的时候由于格式简单,可以用较少的内存和较少的计算就可以完成。这个简单的文件会和OS一块放到系统区,即不是放到一般文件系统所管理的用户数据区。当然,在系统区也有文件系统管理,但这个文件系统往往是自定义的最简单的文件系统(详见SoC嵌入式软件架构设计之七:嵌入式文件系统设计),而不是ext4,fat这些文件系统。
2)当需要运行某个应用时,通过系统区的简单文件系统找到这个文件,并进行简单的解释,将code和data搬到内存中,初始化bss后即跳到entry执行。
可以看到,这种加载方式综合了前面两种方式,其最大地节省内存和计算能力,最大地节省成本。
标签:启动引导 资源紧缺型系统 资源宽裕型系统 bootloader 固件打包
原文地址:http://blog.csdn.net/yueqian_scut/article/details/39118265