1.1程序是如何加载的
大家都知道启动不可能从内存中启动,内存是挥发性的,ROM才能用来保存数据。
启动都是从ROM里面开始的,需要把运行的程序的代码段和数据段加载到内存当中后再跳转到内存中运行。
PC编程时编译出来的程序通常是exe文件,而linux里面就是elf。
但是vxworks/DSP/单片机的主程序就不一样。有的编译出来的是xxx.coff和xxx.bin,有的是xxx.elf和xxx.hex,有的是xxx.out和bin
vxworks编译结果就是vxworks和vxworks.bin
但其根本原理都是一样的
.out/.coff/.exe/.elf全部是一个带加载信息的文件
而.hex/.bin文件则是加载后内存的一个镜像。
下面我用随便一个vxworks文件来说明
objdumpppc -h vxWorks vxWorks: file format elf32-powerpc Sections: Idx Name Size VMA LMA File off Algn 0 .text 0012db70 00100000 00100000 00000060 2**4 CONTENTS, ALLOC, LOAD, CODE 1 .data 0001dea0 0022db70 0022db70 0012dbd0 2**3 CONTENTS, ALLOC, LOAD, DATA 2 .driverRegistTable 00000000 0024ba10 0024ba10 0014ba70 2**0 CONTENTS 3 .pciDriverRegistTable 00000000 0024ba10 0024ba10 0014ba70 2**0 CONTENTS 4 .bss 00017cd0 0024ba10 0024ba10 0014ba70 2**3 ALLOC 5 .debug_aranges 00000320 00000000 00000000 0014ba70 2**0 CONTENTS, READONLY, DEBUGGING 6 .debug_pubnames 000021a5 00000000 00000000 0014bd90 2**0 CONTENTS, READONLY, DEBUGGING 7 .debug_info 00063a43 00000000 00000000 0014df35 2**0 CONTENTS, READONLY, DEBUGGING 8 .debug_abbrev 00003c1b 00000000 00000000 001b1978 2**0 CONTENTS, READONLY, DEBUGGING 9 .debug_line 00019e66 00000000 00000000 001b5593 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_frame 00000014 00000000 00000000 001cf3fc 2**2 CONTENTS, READONLY, DEBUGGING |
这个就是vxworks这个可加载文件的概要情况。
VMA/LMA就是这个段加载的地址。对CPU而言VMA/LMA是一样的,没有进行地址转换。在linux/x86上面,这个地址是可能不同的。具体的原因需要理解MMU。
加载程序加载vxworks时,会去解析各个段的内容,并将其copy到制定的内存地址。最后跳转到代码的入口,操作系统就开始运行了。
我们可以看一下.text和.data的关系,.text是从0x1000000开始的,大小是0x12db70,而.data是从0x22db70开始的,大小0x1dea0
.data段是紧跟在.text段之后的。
存放在内存里面的程序需要使用的段必须由一个程序从elf/bin中取得并最终放到内存当中。这就是加载过程。