我正在开发一个移植到ARM7的项目(最初是在x86上)。它运行在QNX上。由于使用未对齐的指针进行读/写,我们遇到了一些内存对齐问题(SIGBUS错误崩溃)。我只是通过用memcpy替换指针转换和赋值来修复大多数对齐问题,但是这个问题我无法解决这个问题。
在进程初始化之间共享一个内存池:
int m_nSharedMemory = shm_open(EVENT_LIST_NAME, O_RDWR | O_CREAT, 0777);
ftruncate(m_nSharedMemory, nSize)
unsigned char* m_pMemory = (unsigned char*) mmap(0, nSize, PROT_READ | PROT_WRITE, MAP_SHARED, m_nSharedMemory, 0);
内存应该像这样使用:在地址空间的开头有一个Header
,之后有一个Event
数组。因此,nSize = sizeof(Header) + MAX_EVENTS * sizeof(Event)
。
m_pHeader = (Header*)m_pMemory;
m_pEvents = (Event*)(m_pMemory + sizeof(Header));
Header
和Event
都是具有基本类型的结构。据我所知,此内存未对齐,因此执行m_pEvents[0].m_SomeField == 3
或m_pHeader->m_SomeField = 1
可能会触发SIGBUS错误。这种说明无处不在,所以用memcpy替换每一个都会是一个真正的痛苦,我希望我能用其他东西逃脱。
我发现posix_memalign
我认为可以替换shm_open
或mmap
,但不确定是哪一个,但这似乎也无法解决问题。首先,我仍然得到警告。即使忽略警告,我也可以确保内存与sizeof(Header)
对齐,但m_pEvents
不会对齐。
有没有办法在不对此方案进行重大修改的情况下阻止SIGBUS错误?现在编译器正在抱怨因为"cast from 'unsigned char*' to 'Header*' increases required alignment of target type"
(对Event
有类似的警告),但程序没有崩溃,我实在无法解释。
所以,有两个问题:1)为什么不崩溃? 2)如何确保它永远不会,最好通过确保内存对齐并抑制警告