Подтвердить что ты не робот

Запретить неприглаженные обращения к памяти на x86/x86_64

Я хочу эмулировать систему с запрещенными нерациональными обращениями к памяти на x86/x86_64. Есть ли способ отладки или специальный режим?

Я хочу запускать множество тестов (ресурсоемкие) на несколько x86/x86_64 ПК при работе с программным обеспечением (C/С++), предназначенные для SPARC или другого аналогичного процессора. Но мой доступ к Sparc ограничен.

Как я знаю, Sparc всегда проверяет выравнивание в памяти чтения и записи, чтобы быть естественным (чтение байта из любого адреса, но чтение 4-байтовое слово разрешается только при адреса делится на 4).

Может быть, Valgrind или PIN-код имеют такой режим? Или специальный режим компилятора? Я ищу Linux-некоммерческий инструмент, но также доступны инструменты для Windows.

или может быть секретный флаг ЦП в EFLAGS?

4b9b3361

Ответ 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 являются незаконными и, вероятно, будут вести себя как незаконные несвязанные обращения на других архитектурах.