我添加了指定某些数据部分的属性(在任何函数之外,因此它在一种数据部分中),如下所示。
char __attribute__(( aligned(256), __section__(".axpudata") )) mem_local [N_AXEMIS_PER_AXPU][LOCAL_SEGMENT_SIZE];
char __attribute__(( aligned(256), __section__(".axpudata") )) mem_private[N_AXEMIS_PER_AXPU][N_AXEC_PER_AXEMIS*N_THREAD_PER_AXEC][PRIVATE_SEGMENT_SIZE];
uint64_t __attribute__(( aligned(256), __section__(".axpudata") )) mem_knlargs[KNLARGS_SEGMENT_SIZE/8];
struct __attribute__(( aligned(256), __section__(".axpudata") )) es_t axpu_es [N_AXEMIS_PER_AXPU];
struct __attribute__(( aligned(256), __section__(".axpudata") )) reg_csr_t axpu_regs [N_AXEMIS_PER_AXPU];
字符串
但是当我检查Map文件时,我发现mem_local,mem_private,mem_knlargs都分配在'.axpudata'部分,但axpu_es和axpu_regs分配在'.bss'部分。然后我发现axpu_es和axpu_regs不一定要在'.axpudata'部分,如果它们在'.bss'部分也不会引起任何问题。我很好奇为什么它们没有被分配到“.axpudata”部分。在什么情况下会发生这种事情?下面是链接器脚本的一部分。
.axpudata : {
. = ALIGN(65536);
*(.axpudata)
}
/* Uninitialized data */
. = ALIGN(0x10000);
.bss :
{
__bss_start = .;
__bss_start__ = .;
*(.bss*)
__bss_end = .;
__bss_end__ = .;
}
型
添加:
我刚刚发现属性是在struct和es_t之间给出的,比如struct __attribute__(..) es_t axpu_es[..]
,但它应该是struct es_t __attribute__(..) axpu_es[...]
。
2条答案
按热度按时间42fyovps1#
第一部分指定attributes for variables。
第二部分指定类型的属性,其中不包括
__section__
选项。所以,显然你可以指定一个特定的变量应该驻留在一个节中,但不是所有类型的变量都应该这样做。
0tdrvxhp2#
我后来发现这个属性是在struct和es_t之间给出的,比如
struct __attribute__(..) es_t axpu_es[..]
,但它应该是struct es_t __attribute__(..) axpu_es[...]
。当我修复这个问题时,'axpu_es'和'axpu_regs'数组被分配到'.axpudata'部分。