假设我有一个128KB的内存区域。在我的链接器指令中,我将该区域分为三个部分:
每个部分的大小在编译前是未知的,但我已经约束.section_bss在.section_text和.section_data被分配后使用内存区域中的所有剩余空间。
有什么办法可以声明一个耗尽.region_bss中所有可用空间的C数组?假设它是唯一使用.region_bss的东西,所以它可以安全地使用整个区域。例如,但显然是错误的:
char entire_bss[sizeof(.region_bss)];
以下是我对一些预期回复的预答案。首先,我知道sizeof()不能像这样工作。我只是用它来了解一下。其次,假设必须使用数组而不是指针(使用指针求解是可能的并且相当简单)。第三,我知道我可以获得.region_bss的起始和结束地址,但我不知道有任何方法可以使用它们来调整数组的大小。至少没有任何方式适用于C。
很可能没有办法做到这一点,但我希望那里的一些天才已经弄明白了。如果您可以使用Green Hills工具集,则可获得额外的功劳。
答案 0 :(得分:2)
通常你这样做的方式是:
extern char section_bss[];
抛出一些额外的东西,以便编译器,汇编器和链接器知道section_bss
是.section_bss
(或类似名称)的别名。
要获得大小,您可能希望对位于bss末尾的符号执行相同的操作并找到差异。
答案 1 :(得分:2)
有什么办法可以声明一个耗尽
.region_bss
中所有可用空间的C数组?
简短回答是“不。”
如果GreenHills使用GNU工具链和binutils并允许自定义the linker script,那么您可以使用PROVIDE
将变量添加到应用程序命名空间中以标记128K块结束。 (请参阅示例如何访问此类变量here)。你不会有这样一个固定大小的C数组,但程序将能够找到数组的末尾,因此数组的大小通常足以满足C程序的需要。
如果您想使用纯C99来实现这一目标,那么您可能会因为highly unreliable而不幸,因为它不在标准范围内。
答案 2 :(得分:2)
不,你不能。这也很容易理解为什么。在编译阶段,没有.bss和.data的概念,这些是纯粹的链接器约定。编译器知道一些抽象概念(const数据,静态数据,代码),但它们到链接器部分的映射只是一种约定,并且取决于链接器,OS和处理器甚至内存模型选项。在构建位置独立代码时,通常将常量放在代码段中。在嵌入式平台上,你有时必须努力解决这些问题,甚至必须调整你的编码风格(我们曾经有一个基于80186处理器的模型,它是用MS-C 5.1编译器构建的,我们不能使用{ {1}}部分(全局,初始化变量和静态),因为工具链将它们放在ROM中。
我们通过在整个构建过程结束时修补生成的二进制文件来解决您的类似问题。我们从链接器生成的映射文件中提取了不同部分的已用内存(它是一个选项查找),并从给定模型的内存大小中减去它(我们有256K,512K和896K模型)并设置一个具有正确值的全局常量。因此,通过此全局变量对此大小的所有引用都很重要。然后,我们对.data
/ malloc
的实现使用了此内存池。
答案 3 :(得分:0)
您要做的事情将取决于平台。你最好的选择可能是将数组声明为extern char the_array [],end_of_array [];在C文件中,然后,可能在汇编语言源文件中,为the_array和end_of_array声明几个数据部分。然后安排链接器规范,以便the_array将位于自下而上分配的东西的末尾,而end_of_array将位于自上而下分配的东西的开头,并且它们之间不会有任何其他内容。这是可能的 - 我已经在某些平台上完成了 - 但仔细阅读链接器文档以确保链接器在您不期望它时不会重新排列是很重要的。
答案 4 :(得分:0)
有什么问题
extern char __ghsbegin_region_bss[];
extern char __ghssize_region_bss[];
#define entire_bss __ghsbegin_region_bss
#define sizeof_entire_bss ((size_t)__ghssize_region_bss)
?我至少可以想到你可能不满意这个答案的一个原因,但它涉及C ++模板元编程魔术(即entire_bss
的类型不具有正确的大小,因此,依赖于其大小的模板将以不同方式解析。只要你不使用数组的大小(在C中就是这样),这种方法应该没问题。
请注意,__ghssize_region_bss
不是编译时常量 - 直到链接时才会解析 - 因此在编译时100%无法将其置于数组类型的[...]
内。
请参阅Green Hills手册中“章节符号的开头,结尾和大小”一章。