2013-03-05 2 views
5

У меня есть код, который я тестирую на Linux x86/x64. Я хочу отключить автоматическую фиксацию несогласованных данных, чтобы имитировать то, что произойдет на процессоре ARM.Linux x86/x64: отключить неверные настройки данных

В Windows я могу сделать это с SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPT.

Как отключить исправления в Linux? Я не получаю ошибку в автобусе, которую я ожидаю увидеть?

+0

Как остановить разрыв, я нашел Неопределенное поведение Sanitizer для GCC и Clang полезно здесь, потому что несогласованная нагрузка - неопределенное поведение (*** '-fsanitize = undefined' ***). – jww

ответ

6

Я действительно не совсем уверен, если это возможно, чтобы отключить автоматическое выравнивание при поддержке x86 и x86_64 процессоров (это была часть архитектуры права корпорации Intel от i386 или i486 дней и было одним из ключевых продаж точки для архитектуры).

на основе Intel® 64 and IA-32 Architectures Software Developer’s Manual, стр 6-45 в разделе Interrupt 17—Alignment Check Exception (#AC):

Прерывание 17-Alignment Check Exception (#AC)

Exception Класс неисправности.

Описание

Указует, что процессор обнаружил невыровненный операнд в памяти, когда выравнивания проверки было включено. Проверки выравнивания выполняются только в при доступе к данным (или стеку) (не в получении кода или в системном сегменте ). Примером нарушения проверки соответствия является слово, сохраненное по нечетному байтовому адресу, или двойное слово, хранящееся по адресу , а не целое число, кратное 4. В таблице 6-7 перечислены требования к выравниванию , различные типы данных, распознаваемые процессор.

Обратите внимание, что исключение проверки выравнивания (#AC) генерируется только для типов данных , которые должны быть выровнены по слову, двойному слову и квадратному слову . Исключение общей защиты (#GP) генерируется 128-битными типами данных, которые не выровнены по 16-байтовой границе.

Существует таблица, описывающие требования к выравниванию для различных типов данных, а затем в условиях, которые должны быть выполнены для обеспечения возможности проверки выравнивания:

• AM flag in CR0 register is set. 
• AC flag in the EFLAGS register is set. 
• The CPL is 3 (protected mode or virtual-8086 mode). 

Так что, если вы могли бы сделать это в сборке в начало вашей программы, вы, вероятно, могли бы получить исключение выравнивания.

Кроме того, похоже, только код пользовательского режима может генерировать #AC:

Alignment проверочное исключение (#AC) генерируется только при работе на уровне привилегий 3 (режим пользователя). ссылки памяти, которые по умолчанию привилегии уровня 0, такие как дескриптор сегмента нагрузка, не генерирует выравнивания проверки исключений, даже когда вызвано ссылкой памяти сделанной из уровня привилегий 3.

код пользователя не могут непосредственно установить AM в CR0 без операционной системы.

Чтобы ответить на ваш вопрос, у Linux уже может быть код для обработки INT 17h, попробуйте выполнить поиск в источниках ядра, чтобы узнать, можете ли вы найти ссылки. Он должен быть в коде, специфичном для архитектуры.

Также некоторые родственные темы на SO, которые могли бы дать вам несколько указателей:

Смежные вопросы