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:
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