常见的嵌入式程序加载方式
1、大型的嵌入式系统(ARM+Linux架构为例)类似于电脑程序,手机APP的加载方式。稍微大型的嵌入式系统(Linux)应用程序经过编译、连接之后,形成一个类似于exe、apk的可执行文件,将这个执行文件放置到文件系统中的固定路径下。以Linux为例,常用文件系统ext3、ext4等,文件系统根目录下有许多文件夹,如bin、root、usr、opt等。进入存放被执行文件的路径,使用./XXX命令,执行该XXX程序。如果需要开机就执行该程序,则需要将该可执行文件启动,加载到开机启动项内。TIPS:如使用execve命令执行该程序,通过ext4文件的fsopen函数找到XXX这个文件,然后解释其ELF格式,在创建好页表后,将code段和data段搬到内存,初始化bss段,最后跳到entry所在的地方。 2、小型的嵌入式程序(51为例)应用程序在编译、链接之后,会通过二进制工具分析可执行文件的格式,抽出code和data段数据,生成.HEX格式或者.BIN格式,下载到SOC内置的flash中。在上电之后就直接执行了。 3、另一种嵌入式系统架构,SOC的计算能力较弱,但内存资源在百K级别,能支持简单的操作系统(如UCOS),一般没有外挂SDRAM。代码存放在外置的存储设备中,如nand和card。MP3、U盘是典型应用。由于代码量较大,不适宜放到内置flash中,需放在外置存储中,固件需进行优化。应用程序的加载过程:应用程序编译、链接之后生成可执行文件,格式复杂。通过二进制工具将code、data和entry、bss等信息重新组成一个简单的文件,这样操作系统在加载时由于格式简单,可以用较少的内存和计算完成。这个简单文件会与OS一起放在系统区,而不是放在一般文件系统所管理的用户数据区。系统区也有文件系统管理,但往往是自定义的最简单文件系统。需要运行某个应用时,通过系统区的简单文件系统找到文件,解释后将code和data搬到内存中,初始化bss后即跳到entry执行。