C++ ARM中的mmap内存对齐

C++ ARM中的mmap内存对齐,c++,arm,mmap,qnx,sigbus,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, nS

我正在做一个移植到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); 
内存应该这样使用:在地址空间的开头有一个
,之后有一个
事件
数组。因此,
nSize=sizeof(Header)+MAX_EVENTS*sizeof(Event)

Header
Event
都是具有基元类型的结构。据我所知,此内存未对齐,因此执行
m_pEvents[0].m_SomeField==3
m_pHeader->m_SomeField=1
可能会触发SIGBUS错误。这种指令到处都是,所以用memcpy替换每一个指令将是一件非常痛苦的事情,我希望我能用其他的东西逃脱

我发现了
posix\u memalign
,我相信它可以取代
shm\u open
mmap
,但目前还不确定是哪个,但这似乎也不能解决问题。首先,我仍然得到警告。即使忽略警告,我也可以确保内存与
sizeof(Header)
对齐,但是
m\u pEvents
不会对齐

是否有任何方法可以在不对该方案进行重大修改的情况下防止SIGBUS错误?现在编译器正在抱怨,因为从unsigned char*”强制转换为“Header*”增加了目标类型所需的对齐方式“(对于
事件
,也有类似的警告),但是程序没有崩溃,这我真的无法解释


所以,有两个问题:1)它为什么不崩溃?2) 我如何确保它永远不会出现,最好是确保内存对齐并消除警告

您是指armv7还是arm7?您指向的是ram,基本上是跨编译域的,无法确保它永远不会崩溃(您可以禁用对齐检查,结果在armv7和arm7之间有所不同)这种编程风格将始终存在此问题,因此,如果/当您重新编译此代码时,您将始终必须维护此代码。初等指针数学将使您处于正确的起始对齐方式如果您需要在8字节边界(64位)上对齐,则您将分配7或8个额外字节,并调整从alloc返回的指针。除此之外,如果您使用的是结构,则这是一个终身维护问题。请将
标题更改为32/64位对齐,或将填充添加到
nSize
和align
m\u pEvents
。您应该阅读
FSR
(故障状态寄存器),看看这是否是一个校准或权限问题。您可以防止崩溃,但不能确保工作。@artlessnoise,Oweasome,我们询问了面试候选人有关校准的问题,几乎没有,实际上没有,包括大多数员工在内,都没有人能找到简单的解决方案。大多数用if和add进行模运算,其他用if和add进行掩码,很高兴看到这个。。。
m_pHeader = (Header*)m_pMemory;
m_pEvents = (Event*)(m_pMemory + sizeof(Header));