【发布时间】:2016-12-13 13:54:15
【问题描述】:
我想放置一个 2kB 的内存块,在 16 字节之前 1024 字节对齐。
平台:arm、裸机、GNU 工具链。不需要便携性
我可以使用 GCC/属性编译指示、ld 自定义链接器脚本或任何其他解决方案吗?
我想避免为此浪费 1kB(基本上将 3kB 的内存块对齐为 1kB 并添加 1024-16 字节的填充)。
强制特定地址放置数据是可能的,但ld 是否能够在其前后放置变量(或者它只是放置填充的一种方式?)
上下文:通过硬件设计,缓冲区需要在 1k 边界,但我想在之前/之后添加一点空间,以便能够复制到这个缓冲区,并且没有边界检查我的源是否最多 16B 宽.
编辑:添加示例。
假设我的 RAM 从 0x2000000 开始。我需要在其中放置一个 char buf[2048] ,偏移量为 1024*N-16 - 即 (&buf[16])%1024==0 ,希望不会丢失 1008 个填充字节。
(编辑2) 所以我想要:
- 0x2000000 - 一些变量
- 0x2000010 - 其他一些变量 ...
- 0x2000100 - 其他一些变量 ...
- 0x20003F0 - char buf[2048] : 这里 (int)&buf[16]%1024=0x2000400%1024==0
- 0x2000BF0 - 其他一些变量 ...
【问题讨论】:
-
您可以制作 2 个大小为 1024 的缓冲区的结构。您将设置一个与 16 对齐。
-
您应该在链接器脚本中定义一个特定的部分,并使用所需的对齐方式
-
@koper :我希望它们在 1024 之前对齐 16 个字节。您的解决方案 IIUC,将有 2 个大小为 1024 的缓冲区对齐到 16(所以要么对齐到 16,32,48,64 ...)
-
@LP:你能详细说明一下吗?我想创建这样一个脚本,但我无法获得正确的参数/指令,这些参数/指令可以让我在两个边界的幂之前声明数据对齐(并且不会丢失 1k 的内存)。
-
为什么投反对票?这个问题是不是表述不好?