Запретить неприглаженные обращения к памяти на x86/x86_64
Я хочу эмулировать систему с запрещенными нерациональными обращениями к памяти на x86/x86_64.
Есть ли способ отладки или специальный режим?
Я хочу запускать множество тестов (ресурсоемкие) на несколько x86/x86_64 ПК при работе с программным обеспечением (C/С++), предназначенные для SPARC или другого аналогичного процессора. Но мой доступ к Sparc ограничен.
Как я знаю, Sparc всегда проверяет выравнивание в памяти чтения и записи, чтобы быть естественным (чтение байта из любого адреса, но чтение 4-байтовое слово разрешается только при адреса делится на 4).
Может быть, Valgrind или PIN-код имеют такой режим? Или специальный режим компилятора?
Я ищу Linux-некоммерческий инструмент, но также доступны инструменты для Windows.
или может быть секретный флаг ЦП в EFLAGS?
Ответы
Ответ 1
Это сложно, и я не делал этого лично, но я думаю, вы можете сделать это следующим образом:
x86_64 CPU (в частности, я проверил Intel Corei7, но, как я полагаю, другие также) имеет счетчик производительности MISALIGN_MEM_REF, который встречает несогласованные ссылки на память.
Итак, прежде всего, вы можете запустить свою программу и использовать инструмент "perf" под Linux, чтобы получить подсчет количества несогласованного доступа, сделанного вашим кодом.
Более сложным и интересным взломом было бы написать модуль ядра, который программирует счетчик производительности, чтобы генерировать прерывание при переполнении, и заставить его переполнять первый неустановленный load/store. Ответьте на это прерывание в вашем модуле ядра, но посылая сигнал вашему процессу.
Это фактически превратит x86_64 в ядро, которое не поддерживает неравномерный доступ.
Это не будет простым, но - помимо вашего кода, системные библиотеки также используют неприглаженные обращения, поэтому будет сложно отделить их от вашего собственного кода.
Ответ 2
Я только что прочитал вопрос Неуправляемый доступ к памяти всегда вызывает ошибки шины?, которые связаны с статьей Википедии Ошибка сегментации.
В статье есть замечательное напоминание о довольно необычном Флаги процессора Intel AC aka Проверка выравнивания.
И здесь, как включить его (из Ошибка сегментации):
#if defined(__GNUC__)
# if defined(__i386__)
/* Enable Alignment Checking on x86 */
__asm__("pushf\norl $0x40000,(%esp)\npopf");
# elif defined(__x86_64__)
/* Enable Alignment Checking on x86_64 */
__asm__("pushf\norl $0x40000,(%rsp)\npopf");
# endif
#endif
После того, как он будет работать так же, как настройки выравнивания ARM в /proc/cpu/alignment
, см. ответ для примера, чтобы уловить недопустимый доступ к памяти?.
Кроме того, если вы используете GCC, я предлагаю вам включить предупреждения -Wcast-align
. При создании для цели со строгими требованиями к выравниванию (например, ARM) GCC будет сообщать о местоположениях, которые могут привести к нерациональному доступу к памяти.
Ответ 3
Возможно, вы каким-то образом можете скомпилировать SSE со всеми выровненными ходами. Несвязанные обращения с movaps
являются незаконными и, вероятно, будут вести себя как незаконные несвязанные обращения на других архитектурах.