我正在开发一个正在移植到 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
or mmap
,但还不确定哪个,但这似乎也不能解决问题。一方面,我仍然收到警告。即使忽略警告,我也可以确保内存与 对齐sizeof(Header)
,但m_pEvents
不会对齐。
有没有办法在不对这个方案进行重大修改的情况下防止 SIGBUS 错误?现在编译器正在抱怨,因为"cast from 'unsigned char*' to 'Header*' increases required alignment of target type"
(有一个类似的警告Event
),但程序没有崩溃,我真的无法解释。
所以,有两个问题:1)为什么它不会崩溃?2)我如何确保它永远不会,理想情况下通过确保内存对齐并抑制警告