2013-03-05 20 views
5

Mam kod, który testuję na Linuxie x86/x64. Chcę wyłączyć automatyczne dopasowywanie nieprawidłowo ustawionych danych, aby symulować, co stanie się z procesorem ARM.Linux x86/x64: Wyłącz błędne ustawienia danych

W systemie Windows mogę to zrobić pod numerem SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPT.

Jak wyłączyć poprawki w systemie Linux? Nie dostaję błędu autobusu, który spodziewam się zobaczyć?

+0

jako luki zatrzymania Znalazłem zachowanie niezdefiniowane Sanitizer dla GCC i Clang pomocne, ponieważ źle ustawione obciążenie jest niezdefiniowanym zachowaniem (*** '-fsanitize = undefined' ***). – jww

Odpowiedz

6

naprawdę nie jestem pewien, czy jest możliwe, aby wyłączyć automatyczne wyrównanie obsługiwanego przez x86 i x86_64 procesorów (to jest częścią architektury prawej Intela z i386 lub i486 dni i był jednym z kluczowych sprzedaży punkty za architekturę).

podstawie Intel® 64 and IA-32 Architectures Software Developer’s Manual, strona 6-45 sekcji Interrupt 17—Alignment Check Exception (#AC):

przerwań 17-Alignment Check Exception (#AC)

Wyjątek klasy wina.

Opis

wskazuje, że procesor wykrył niewyrównany argumentu pamięci, gdy wyrównanie sprawdzenia jest włączone. Sprawdzenia wyrównania są przeprowadzane tylko w przypadku dostępu do danych (lub stosu) tylko w przypadku dostępu do kodu (nie dotyczy to pobierania kodu lub dostępu do segmentów systemu ). Przykładem naruszenia sprawdzania zgodności jest słowo zapisane na nieparzystym adresie bajtu lub podwójne słowo przechowywane pod adresem nie będące wielokrotnością całkowitą z 4. Tabela 6-7 zawiera listę wymagań różnych typów danych rozpoznawanych przez procesor.

Należy zwrócić uwagę, że wyjątek sprawdzania dopasowania (nr AC) jest generowany tylko dla typów danych, które muszą być wyrównane na granicach słów, podwójnych słów i czwórek . Wyjątek ogólnej ochrony (#GP) jest generowany 128-bitowy typy danych, które nie są wyrównane na 16-bajtowej granicy.

Jest tabelę opisującą wymagania wyrównania dla różnych typów danych, a następnie warunków, które muszą być spełnione w celu umożliwienia kontroli Wyrównanie:

• 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). 

Więc jeśli można to zrobić w montażu w rozpoczęcie programu, prawdopodobnie można uzyskać wyjątek wyrównania.

Także to wygląda tylko kod trybu użytkownika może generować #AC:

wyjątki Wyrównanie-Check (#AC) są generowane wyłącznie podczas pracy przy uprawnień poziomie 3 (Tryb użytkownika). referencje pamięci, które domyślnie uprawnień poziomie 0, takich jak segmentu deskryptora obciążeń, nie generują wyjątki alignment-kontrolne, nawet jeśli spowodowane przez odniesienie pamięci wykonane z uprawnieniami 3.

kod użytkownika nie mogą bezpośrednio ustawić AM w CR0 bez pomocy systemu operacyjnego.

Aby odpowiedzieć na twoje pytanie, Linux może już mieć kod do obsługi INT 17h, spróbuj przeszukać źródła kernela, aby sprawdzić, czy możesz znaleźć odniesienia. Powinien znajdować się w specyficznym dla architektury kodzie.

również kilka podobnych wątków na SO, który może dać Ci kilka wskazówek: