首页/文章/ 详情

CPU core原理2

8月前浏览6522

1.1程序是如何加载的

大家都知道启动不可能从内存中启动,内存是挥发性的,ROM才能用来保存数据。

启动都是从ROM里面开始的,需要把运行的程序的代码段和数据段加载到内存当中后再跳转到内存中运行。

1.1.1为什么要加载

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中取得并最终放到内存当中。这就是加载过程。


来源:Trent带你学硬件
UGUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-03-01
最近编辑:8月前
Trent硬件设计
签名征集中
获赞 13粉丝 9文章 45课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈