
链接文件连载 (1)- CACHE / NON-CACHE
CACHE / NON-CACHE
抛出问题
如何在链接过程中,把不同的函数指定放在CACHE 或者是 NON-CACHE呢。
实际代码使用
首先我们定义两个函数。让他们分别放在cache上和non-cache
这里一目了然,两个函数,分别放在cache 和 non-cache。那么我们需要在链接文件里面如何实现呢?
这里我们采用的是Hightec编译器来做解释。
从上面的代码
可以看到 两个字段
- .in_cache.text
- .in_noncache.text
那么在链接文件如何体现呢?
链接文件 .ld 或者 .lsl 这里在里面添加一些定义如下
链接文件如何改动
地址定义
使用指令REGION_MIRROR来mirror一下两个地址。实际上在物理空间,这两个地址是一个地址。后面在map文件里也可以看出来。
给地址改个名字,这样看起来方便一点
定义代码存放的位置
哦,这里恍然大悟,看到了 前面代码里面用#pragma 指定的位置。
好我们编译一下看看结果。
这。。。。有点长。。。。请往后拉这看。
可以看出来两个函数的地址A 与 8.并且 地址是连续的。
这里可能有人会问I-Sec 和 O-Sec是什么意思。
1. O-Sec(Output Section):O-Sec表示目标文件中的输出区段。在编译过程中,源代码被编译成目标文件,而目标文件中的代码和数据会被划分到不同的区段中。O-Sec存储着最终生成的可执行文件或库文件中的代码和数据。
2. I-Sec(Input Section):I-Sec表示目标文件中的输入区段。当将多个目标文件链接起来生成最终的可执行文件或库文件时,链接器会将各个目标文件中的I-Sec合并在一起。I-Sec是链接器在进行链接过程中使用的区段。
总结起来,O-Sec代表目标文件中的输出部分,而I-Sec代表目标文件中的输入部分,在链接过程中会合并多个目标文件的输入部分形成最终的可执行文件或库文件。
最终我们看一下elf文件解析出来的汇编+code
查看结果
下面是链接好了的可执行文件。(elf文件)
这里是未链接的编译好了的汇编 (.o 文件)
对比上面两个汇编。确实 实际的地址调用 和我们前面的设计一致。
这里就完成了 对cache的指定函数存放。
文章转载自公众号:汽车与基础软件
