2013-03-05 7 views
5

Linux x86/x64でテストしているコードがあります。私は、ARMプロセッサで起こることをシミュレートするために、整列していないデータの自動修正を無効にしたいと考えています。Linux x86/x64:整列していないデータフィックスアップをオフにする

Windowsでは、SetErrorMode and SEM_NOALIGNMENTFAULTEXCEPTとすることができます。

Linuxでフィックスアップを無効にするにはどうすればよいですか?私は見たいと思うバスのエラーを取得していないよ?

+0

は、私は未定義の動作消毒を見つけましたミスアライメントされた負荷が未定義の動作(*** '-fsanitize = undefined' ***)であるため、ここではGCCとClangが役に立ちます。 – jww

答えて

6

私は実際にx86x86_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特権レベルから作られたメモリ参照 によって引き起こされる場合でも、 アライメント・チェック例外を生成しないことをメモリ参照AMCR0に設定してください。

あなたの質問に答えるために、Linuxは既にINT 17hを処理するコードを持っているかもしれません。カーネルソースを掘り下げて参照があるかどうか調べてみてください。それはアーキテクチャ特有のコードでなければなりません。

またあなたにいくつかのポインタを与えるかもしれないようにいくつかの関連スレッド:ストップギャップとして

関連する問題