2

我正在用C语言编写适用于ECOS操作系统的mipsisa32架构的程序。这是我第一次使用 ecos 和 mips,我遇到了奇怪的问题。我使用动态分配的内存块并向其中写入一些数据。但是当我尝试将双精度值写入未与 8 字节对齐的地址时,我得到异常编号 5,它在 hal_intr.h 中声明为 CYGNUM_HAL_VECTOR_STORE_ADDRESS,后来重新定义为 CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_WRITE。

如果我将指针指向目标和源并将它们转换为 long long*,并且它们将值从一个分配给另一个,那么我不会得到异常。

从未对齐的地址读取双精度时也会发生同样的事情,但只有双精度,而不是长长。这确实有意义,因为汇编代码确实使用了不同的指令。我不知道 mips 程序集,但从我所见,我得出的结论是,在存储/读取 long long 时,它以两个 4 字节的块进行,但对于 double,它一步完成。

所以你有什么建议? 这是正常行为吗?

我最后的手段是确保自己的地址是对齐的,这会增加额外的开销,因为我写入了许多动态分配的缓冲区。

4

1 回答 1

1

IIRC MIPS 不支持未对齐的内存访问。您可能违反了为任何数据类型返回正确对齐的块的要求。malloc

double作为单个 64 位字提取。所以它需要8个字节的对齐(这里:8位)。对于 long long:在 32 位(字)架构上,使用两个具有 32 位内存访问的寄存器来模拟(ARM 上的加载双字指令LDRD基本上是两个字加载指令)。所以 4 个字节是足够的(但可能不是最优的)对齐。

我假设您目前正在与单词边界对齐。max_align_t为了安全起见,您应该与 (C11) 或类似(C11 之前)对齐。

于 2015-08-07T13:40:48.837 回答