私は実際にx86
とx86_64
プロセッサでサポートされているオートアライメントをオフにすることが可能であるならば(それはi386
またはi486
日からIntelのアーキテクチャ権の一部となって、キー売りの一つであったたかなりわからないんだけどアーキテクチャのポイント)。
割り込み17-アライメントチェック例外(#AC)
例外クラスフォルト:セクションInterrupt 17—Alignment Check Exception (#AC)
下Intel® 64 and IA-32 Architectures Software Developer’s Manual、ページ6-45
に基づいて
。
説明
はチェック アラインメントが有効になっていた場合、プロセッサは、アラインされていないメモリオペランドを検出したことを示します。アライメントチェックは、データ(またはスタック)アクセス(コードフェッチまたはシステムセグメント アクセスではない)内でのみ で実行されます。アラインメントチェック違反の例は、奇数バイトアドレスに と格納されたワード、またはアドレスに格納されたダブルワードで、 は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
を生成することができますように。また、それが見えます:
アライメント・チェック例外(#AC)は 特権レベル3(ユーザーモード)で動作する場合にのみ生成されます。そのようなセグメント記述子負荷として 特権レベル0のデフォルトは、ユーザコードを直接設定することはできません
3特権レベルから作られたメモリ参照 によって引き起こされる場合でも、 アライメント・チェック例外を生成しないことをメモリ参照AM
をCR0
に設定してください。
あなたの質問に答えるために、Linuxは既にINT 17h
を処理するコードを持っているかもしれません。カーネルソースを掘り下げて参照があるかどうか調べてみてください。それはアーキテクチャ特有のコードでなければなりません。
またあなたにいくつかのポインタを与えるかもしれないようにいくつかの関連スレッド:ストップギャップとして
は、私は未定義の動作消毒を見つけましたミスアライメントされた負荷が未定義の動作(*** '-fsanitize = undefined' ***)であるため、ここではGCCとClangが役に立ちます。 – jww