我正在用C language为mipsisa32体系结构编写程序,该架构与ECOS操作系统一起工作。这是我第一次与ecos和mips合作,我遇到了奇怪的问题。我使用动态分配的内存块,并将一些数据写入其中。,但是当我试图编写双值来处理未对齐的8字节时,我会得到异常号5,它在hal_intr.h中声明为CYGNUM_HAL_VECTOR_STORE_ADDRESS,后来被重新定义为CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_WRITE。
如果我将指向目的地和源的指针转换为long*,并且将值从一个分配到另一个,那么我就没有异常。
同样的情况发生在从未对齐地址读取double时,但只使用double,而不长long。这是有意义的,因为汇编代码确实使用了不同的指令。我不知道mips程序集,但据我所见,我得出的结论是,在长时间存储/读取long时,它是以两块4字节为单位存储/读取的,但是对于double,它是在一步内完成的。
那么你有什么建议?这是正常的行为吗?
我的最后一招是确保地址是对齐的,这将增加额外的开销,因为我写入了许多动态分配的缓冲区。
发布于 2015-08-07 13:40:48
IIRC MIPS不支持非对齐内存访问。您可能违反了要求 for malloc,以返回针对任何数据类型正确对齐的块。
double作为单个64位字获取。因此,它需要对齐8字节(此处:8位)。很长一段时间:在32位( word )架构上,使用具有32位内存访问的两个寄存器进行模拟(加载双字指令,因为ARM上的LDRD基本上是两个字加载指令)。因此,4字节是足够的(但可能不是最优的)对齐。
我想你现在是在与字词的界限保持一致。为了安全起见,您应该与max_align_t (C11)或类似的(pre-C11)对齐。
https://stackoverflow.com/questions/31878750
复制相似问题