2013-03-05 5 views
5

Ich habe etwas Code, den ich auf Linux x86/x64 testen. Ich möchte die automatische Korrektur von fehlausgerichteten Daten deaktivieren, um zu simulieren, was auf einem ARM-Prozessor passieren würde.Linux x86/x64: Deaktivieren Sie falsch ausgerichtete Datenkorrekturen

Unter Windows kann ich es mit SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPT tun.

Wie kann ich Fixups unter Linux deaktivieren? Ich bekomme nicht den Busfehler, den ich erwarte zu sehen?

+0

Als Lückenbüßer, habe ich das nicht definiertes Verhalten gefunden Sanitizer für GCC und Clang, um hier hilfreich zu sein, weil die fehlausgerichtete Last ein undefiniertes Verhalten ist (*** '-fanitize = undefined '***). – jww

Antwort

6

Ich bin wirklich nicht sicher, ob es möglich ist, die automatische Ausrichtung von x86 und x86_64 Prozessoren unterstützt auszuschalten (es ist Teil der Intel-Architektur direkt von den i386 oder i486 Tage und war eines der wichtigsten Verkaufs gewesen Punkte für die Architektur).

Basierend auf Intel® 64 and IA-32 Architectures Software Developer’s Manual, Seite 6-45 unter dem Abschnitt Interrupt 17—Alignment Check Exception (#AC):

Interrupt 17-Alignment Check Exception (#AC)

Ausnahmeklasse Fehler.

Beschreibung

Zeigt an, dass der Prozessor einen nicht ausgerichteten Speicheroperanden festgestellt, wenn Ausrichtung aktiviert wurde überprüfen. Alignment-Checks werden nur in Daten (oder Stack-) Zugriffen ausgeführt (nicht in Code-Fetches oder System-Segment Zugriffe). Ein Beispiel für eine Ausrichtungsüberprüfungsverletzung ist ein gespeichertes Wort an einer ungeraden Byteadresse oder ein an einer Adresse gespeichertes Doppelwort, das kein ganzzahliges Vielfaches von 4 ist. Tabelle 6-7 listet die Ausrichtung Anforderungen verschiedene Datentypen auf, die von erkannt werden der Prozessor.

Beachten Sie, dass die Ausrichtungsüberprüfungsausnahme (#AC) nur für Datentypen generiert wird, die an Wort-, Doppelwort- und Vierfachwortgrenzen ausgerichtet werden müssen. Eine allgemeine Schutzausnahme (#GP) wird generiert 128-Bit Datentypen, die nicht auf einer 16-Byte-Grenze ausgerichtet sind.

Es gibt eine Tabelle, die die Ausrichtungsanforderungen für verschiedene Datentypen zu beschreiben, durch die Bedingungen gefolgt, die zur Aktivierung Ausrichtung Prüfung erfüllt werden müssen:

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

Also, wenn Sie dies bei der Montage in dem tun könnten Wenn Sie Ihr Programm starten, können Sie wahrscheinlich eine Ausrichtungsausnahme erhalten.

Auch sieht es aus wie nur Code-User-Modus #AC erzeugen kann:

Alignment-Check Ausnahmen (#AC) nur dann erzeugt, wenn bei Berechtigungsstufe 3 (Benutzermodus) arbeitet. Speicherreferenzen, dass standardmäßig auf Berechtigungsstufe 0, wie Segmentdeskriptortabellen Lasten, erzeugen keine Ausrichtung Prüfung Ausnahmen, auch wenn von Berechtigungsebene gemacht durch eine Speicherreferenz verursacht 3.

Benutzercode kann nicht direkt festgelegt AM in CR0 ohne Hilfe des Betriebssystems.

Also, um Ihre Frage zu beantworten, könnte Linux bereits Code für die Handhabung INT 17h haben, versuchen Sie, durch die Kernelquellen zu graben, um zu sehen, ob Sie irgendwelche Hinweise finden könnten. Es sollte im architekturspezifischen Code enthalten sein.

auch einige verwandte Themen auf SO, die Ihnen einige Hinweise geben könnte:

Verwandte Themen