目标码格式解析之DSP目标码Cinit段

什么是DSP

一般来说DSP就是数字信号处理器,简单来说就是一块芯片,以Ti公司最为著名。

什么是DSP程序

DSP程序即可烧录在DSP中的可执行文件,现在比较运用广泛的开发环境CCS5.5,一般用户都是通过CCS5.5来开发调试对应的DSP软件。最后将其烧录至芯片中。

什么是段信息

TI的编译器生成的目标文件是一种模块化的ELF格式或COFF格式文件(这两种格式可选)。代码和数据在ELF文件中以段的形式组织。一个段在内存空间中会占连续一块code或data。

知识点:TI的编译器生成的目标文件就是可烧录在DSP中的可执行文件,后续说的可执行文件、目标文件、目标码是同一文件,个人叫法不同,不必深究。

可执行文件内部:
1.头部信息:用以声明文件格式等信息
2.段信息表:包含了段的完备信息,如段的绝对地址、名字、属性以及数据等
3.段信息:代码和数据在文件中以段的形式保存

知识点:可以使用对应编译链工具来查看文件的段信息表用以分析段信息是否全面。

这些段可分为两种,已初始化段和未初始化段。已初始化段主要包括数据表和可执行代码,如:.text、.cinit、.const等;未初始化段用于保留存储器空间,程序利用这些空间在运行时创建和存储变量,如.bss段,.stack段,.far段,有些段,如.sysmem段,如果C程序没有用到malloc,calloc等这些函数来分配存储器空间的话,编译器就不创建.sysmem块。

每个段的具体内容是:
.text 存放可执行代码和浮点数常量
.cinit C语言全局变量和静态变量的C初始化记录列表,代码运行时要对应拷贝到相应的变量空间中
.const 存放已明确初始化的字符串常量,全局常量和静态常量
.bss 存放没有初始化的全局变量和静态变量。在小端模式中,.bss块也为常数宏保留空间。
.stack 为系统堆栈分配存储器。这个存储器用于将变量传递至函数以及分配局部变量。
.far 以far声明的全局/静态变量
.sysmem 为动态存储器函数malloc、calloc、realloc分配存储器空间。

知识点:在程序开始运行时,数据从.cinit块中拷贝至全局变量和静态变量的地址中,作为初始值。

Cinit段数据分析

在生成的目标文件里,DSP全局初始化变量的值是在.cinit段对应记录中,DSP汇编语言的初始化变量是放在.data段。

对于.bss中的全局初始化变量的初始化过程是可以通过编译选项来选择不同的初始化过程,它们是选项-c和-cr。

-c为运行时初始化
-cr为加载时初始化

在编译器生成目标文件中,会将C程序中初始化的全局/静态变量的初始值按一定结构放在.cinit中,但实际全局/静态变量占用的地址空间在.bss段中。如果是-c选项,那么C初始化函数c_int00()会读取.cinit段中的记录信息,分别初始化.bss段中的全局/静态变量。如果是-cr选项,那么全局/静态变量的初始化工作由loader程序完成,而不是c_int00()函数。也就是加载程序后,loader读取.cinit段的内容,然后初始化.bss的全局/静态变量。
在这里插入图片描述
知识点:对比-c和-cr生成的两种可执行文件的初始化c_int00()函数,发现函数的操作是一样的,区别在于,由于-c下.cinit段的信息会放在c_int00()函数可以读到的地址上,而-cr.cinit段的信息不会放在c_int00()函数可以读到的地址上,因此操作相同,但是结果不同。因此可认为-cr下c_int00()函数不能成功完成全局/静态变量的初始化。

Loader操作

无法在对应的手册中查询到loader是否是一个工具文件或者调用库,但是可以从cinit段信息中分析出loader的功能。
在这里插入图片描述
由此可见loader的操作其实就是在代码运行前提前将数据放到对应的bss保存的地址上。

可以根据cinit段信息进行解析:
1.数据大小 
2.数据放置的地址 
3.数据内容
将数据放到地址上就完成了cinit段的loader操作

结尾

当然不同可执行文件格式也会对应不同cinit操作,这里使用的是coff格式的对比,elf格式中还存在cinit保存的是压缩数据的情况,这时loader不仅需要提取出地址与数据,还要将数据解压缩再放到地址中,后续再进行介绍。

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值