bootrom或VxWorks镜像一般可以编程成多种文件类型,例如bootrom、bootrom.bin、bootrom.hex、bootrom.pxe、vxWorks、vxWorks.bin等
名字中没用后缀的bootrom和vxWorks,以及编译application生成的*.o、*.out、*.vxe等文件,都是一种elf (Executable and Linkable Format) 格式的文件。这种文件由四部分组成:ELF header、Program header table、Section、Section header table,这里面包含了符号表等信息,支持动态加载、在线调试等功能。所以bootrom启动后,动态加载的镜像是vxWorks,而不是vxWorks.bin;VxWorks运行时动态加载的app是*.o,而不是*.a
使用WindRiver IDE集成的readelf或objdump就可以读取elf文件里的信息
网上搜一下elf文件的格式定义,就可以很容易的写出自己的readelf
如果只保留elf文件的Section,那就是bin文件了,使用objcopy命令就可以做到。例如下图,将bootrom转换为bootrom.bin
bin就是Binary的意思,它就是一种二进制文件。在设备里直接运行的只能是二进制文件,因此烧写引导设备时,用的是bootrom.bin,而不是bootrom
hex是Motorola EXORmacs格式(也叫Motorola S28)的文件,objcopy可以将bin文件直接转换为hex格式
hex文件一般长这样
它用ASCII码里的可打印字符来表示bin文件里的数据。前两个字符的S0表示头部,S8表示尾部,S2表示中间的数据。挨着的两个字符用十六进制表示本行的长度。S2行接下来六个字符表示行数。最后的两个字符是校验码。因此,中间的就是数据了(上图标红的部分)。那么,第二行的14,就表示“6字符长度位 + 32字符数据位(bin文件的16个字节) + 2字符校验码 = 40字符 = 20字节 = 0x14字节”
pxe(Preboote Xecute Environment)是Intel开发的技术,它提供了一种使用网络接口启动计算机的机制。引导VxWorks时的bootrom.pxe是如何生成的呢?其实就是在bootrom.bin的前面加上1024个0x90。哪位知道这是什么规则?