ARM

时间:2017-05-29 13:11:42

标签: c++ arm mmap qnx sigbus

我正在开发一个移植到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));

HeaderEvent都是具有基本类型的结构。据我所知,此内存未对齐,因此执行m_pEvents[0].m_SomeField == 3m_pHeader->m_SomeField = 1可能会触发SIGBUS错误。这种说明无处不在,所以用memcpy替换每一个都会是一个真正的痛苦,我希望我能用其他东西逃脱。

我发现posix_memalign我认为可以替换shm_openmmap,但不确定是哪一个,但这似乎也无法解决问题。首先,我仍然得到警告。即使忽略警告,我也可以确保内存与sizeof(Header)对齐,但m_pEvents不会对齐。

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

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

0 个答案:

没有答案