LINUX.ORG.RU

спецы по sparc32! вопрос по alignment!


0

0

sparcv8.pdf (p.46):

Alignment Restrictions:

Halfword accesses must be aligned on a 2-byte boundary, word accesses (which include instruction fetches) must be aligned on a 4-byte boundary, and doubleword accesses must be aligned on an 8-byte boundary. An improperly aligned address causes a load or store instruction to generate a mem_address_not_aligned trap.

найдено в ядре в нашем случае я вижу, что 8-байтная величина располагается по адресу не кратному 8. ниже приводится фрагмент лога > alloc_inode sz f0280e64 8 где f0280e64 - это адрес. 8 - это длина переменной, к которой на следующем шаге произойдет обращение. после этого происходит зависание.

даже если аллокатор выделит память с указателем кратным 8, то при копировании такой структуры в др.область, которая не выровнена по 8, при обращении к переменной опять произойдет трап!

я не специалист в sparc, не знаю возможно ли обработать trap так, чтобы заполнить переменную правильным значением и вернуться на следующий шаг.

и я уверен, что 64-битная проблема встретятся и дальше.

спаркологи! поможите чем можете! что мне делать?

anonymous

Что делать? НЕ ИСПОЛЬЗОВАТЬ НЕВЫРОВНЕННЫЙ ДОСТУП, блин. Надо собрать 64-битное число из произвольным образом расположенной в памяти структуры - собирай её по байтикам, типа v = buf[i]+(buf[i+1]<<8) + ..., ну, естественно, с учётом endianess, проверять надо.

А за всякий высер вроде long v = *((long*)(buf+i)) надо отрывать быдлокодеру голову и к жопе её пришивать, для устранения противоречия между видимым и действительным.

anonymous
()
Ответ на: комментарий от anonymous

Предыдущий оратор, в общем-то, прав.

Но если речь идет о портировании проекта, то проще написать
некий класс, принимающий указатель на невыровненную область и
читающий из нее 4- или 8-байтовое значение.

Тогда ублюдочное:
long v = *((long*)(buf + i));
можно быстро заменить на:
long v = *((my_uint32*)(buf + i));

blackice
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.