LINUX.ORG.RU

unaligned access


0

0

Пытаюсь воспроизвести subj (архитектура IA64)-- надо для отладки.

ммаплю кусок памяти, потом отдаю его сдвинутым на некое нечетное число
чаров (три, например). Впихиваю туда int -- по идее, должно
заругаться на unaligned access. Нифига, все работает!


char *c=(char*)mmap(0,12,PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
int *p=(int*)(c+3);
*p=12345;
fprintf(stderr,"%p: %d \n",p,*p);
p[1]=67890;
fprintf(stderr,"%p: %d \n",p+1,p[1]);

0x2000000000040003: 12345
0x2000000000040007: 67890

И icc, и gcc компилил, и все комбинации сдвигов/типов пробовал...

Почему?

★★★★★

ну когда мне однажды попался ia64, linux и баг связанный с unaligned access, то он вовсе не грохался -- там видимо есть обработчик, и про unaligned access был ворнинг в логах.

dilmah ★★★★★
()

Понял, unaligned access имеет место быть но почему-то никто не
ругается... А раньше ругалось, помню!

volatile long int *p=(long int*)(c+1);
int i;
for(i=1;i<5000000;i++)
*p=12345l;

time ./a.out
0x2000000000040001: 12345
0x2000000000040009: 67890

real 0m2.237s
user 0m0.874s
sys 0m1.362s

аналогичное но выравненное:
volatile long int *p=(long int*)(c+0);
int i;
for(i=1;i<5000000;i++)
*p=12345l;

time ./a.out
0x2000000000040001: 12345
0x2000000000040009: 67890

real 0m0.020s
user 0m0.020s
sys 0m0.001s

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> ...то он вовсе не грохался -- там видимо есть обработчик, ...

Да, конечно, ядро должно ворнинги сыпать. Но почему-то не сыпет...

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

> Разве на IA64 запрещен unaligned access?

Да. Мне приходилось с ним (на этой же машине) сталкиваться...

К тому ж я привел вверху пример. На IA64 время доступа к данным увеличивается в сотни раз (кстати, на x86-64 оно не меняется).

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

>Да, конечно, ядро должно ворнинги сыпать. Но почему-то не сыпет...

глянуть сырцы/настройки ядра? там _должна_ быть такая опция

generatorglukoff ★★
()
Ответ на: комментарий от Die-Hard

Аналогичное видел давно на MIPS и PowerPC,
в обоих случаях ядерный обработчик имитировал все как надо,
но жрал ресурсы аналогично, т.е. раз в 100
время увеличивалось на некоторых тестах.

MIPS Linux еще тогда умудрялся разрешать на время обработки прерывания,
в результате ethernet-драйвер (тоже, как оказалось, содержал неудачный
в этом плане код) приводил к рекурсии и гроху.

io ★★
()
Ответ на: комментарий от dilmah

> sysctl -a | grep align

Ничего нету.

Спасибо всем за советы. Я по замерам времени отловил нужные места.

Помню, года 3 назад я чего-то крутил на этой машине, чтобы избавиться от ворнинга. Но абсолютно не помню, что именно. Как руки дойдут, посмотрю -- где-то записывал...

Вдогонку вопрос про атомарность и выравнивание (просто вдруг интересно стало).

GNU нам гарантирует, что обращение (и чтение, и запись) к любому челочисленному типу атомарно. А что будет, если оно неправильно выровнено? Для IA64, для x86-64 и x86, кто-нибудь знает?

Как руки дойдут, попробую райсы им устроить.

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