0

我正在开发一个正在移植到 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 == 3m_pHeader->m_SomeField = 1可能会触发 SIGBUS 错误。这种指令无处不在,所以用 memcpy 替换每个指令将是一个真正的痛苦,我希望我能摆脱别的东西。

我发现posix_memalign我相信哪个可以替代shm_openor mmap,但还不确定哪个,但这似乎也不能解决问题。一方面,我仍然收到警告。即使忽略警告,我也可以确保内存与 对齐sizeof(Header),但m_pEvents不会对齐。

有没有办法在不对这个方案进行重大修改的情况下防止 SIGBUS 错误?现在编译器正在抱怨,因为"cast from 'unsigned char*' to 'Header*' increases required alignment of target type"(有一个类似的警告Event),但程序没有崩溃,我真的无法解释。

所以,有两个问题:1)为什么它不会崩溃?2)我如何确保它永远不会,理想情况下通过确保内存对齐并抑制警告

4

0 回答 0