Я работаю над проектом, который переносится на 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) Как мне убедиться, что это никогда не произойдет, в идеале, убедившись, что память выровнена и подавив предупреждение
Задача ещё не решена.
Других решений пока нет …