выравнивание памяти mmap в ARM

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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]