2017-10-29 6 views
2

intel IA-64と32の本をダウンロードしました。CPUの仕組みについてもっと深く知りたいからです。だから私は本を読んで、いくつかのものをコード化し始めました。 I IDTを有効にして、私は割り込みハンドラをプログラムしたい場合、私はそのコードを持っている:gccのクロスプラットフォーム版は、私の関数の属性タグ__attribute __((interrupt))を無視します。

extern "C" __attribute__((interrupt)) void test (void* ptr) 
{ 

} 

int main (void) 
{ 
    return 0; 
} 

私はi686-elf-g++ -Wall -Wextra -O2 -c -m32 main.cppでコンパイルするとき、私は次の警告がありますmain.cpp:6:60: warning: 'interrupt' attribute directive ignoredを、私はg++ -Wall -Wextra -O2 -c -m32 main.cppてコンパイルする場合、コンパイルがちょうどうまく機能し、コードが生成され、それが最後にIRET命令でなければなりません(それは私が欲しいものです)のようなものです:

Disassembly of section __TEXT,__text: 
_test: 
     0:  55  push ebp 
     1:  89 e5 mov  ebp, esp 
     3:  fc  cld 
     4:  5d  pop  ebp 
     5:  cf  iretd 
     6:  66 2e 0f 1f 84 00 00 00 00 00 nop  word ptr cs:[eax + eax] 

誰もが、私はGCCの私のクロスプラットフォームのバージョンでこの警告を持っている理由の任意のアイデアを持っていますか? (なぜ私は割り込みハンドラがgccのパラメータにポインタを持っていなければならないのか疑問に思っています)

ありがとう!

+0

Windows上にWindowsオブジェクトファイルを作成するための "通常の" g ++の設定をしていますか? 32ビットのx86コードを作るためにgccの特別な 'i686'バージョンは必要ないので、最初は混乱しました。 –

+0

@PeterCordes私はmacOSを使い、g ++はclang ++ 9.0.0です。真実を伝えるために、私が始めたときは自分が何をしているのか分からなかったので、私はちょうどOSDev [リンク](http://wiki.osdev.org/GCC_Cross-Compiler#OS_X_Users)の教科書に従った。しかし、私はnullにプレフィックス値を設定しない場合gccは、ターゲットアーキテクチャ(と私の場合はi686だった - とエルフはtutorielのためですが、多分私はそれを必要としない) – Adrien

+2

@PeterCordes:私は、OSディベロップメントを行い、クロスコンパイラを使用しているという質問から(割り込みディレクティブを使用して)仮定しました(いくつかのディストリビューションがいくつかのホストOS機能を使用するためにlibgccを結びつけるパッチを使用していました)。同様に、OS/Xでは、_LD_は、OS Dev(GNU Binutilsもまた手頃です)を可能にする(リンカスクリプトのような)必要なオプションの多くをサポートしていません。 –

答えて

2

interrupt属性は、x86/x86-64のアーキテクチャをターゲットとG ++ 7.0とlater.Iで利用可能であることは、あなたのi686-elf-g++クロスコンパイラが7.0よりも早く、あなたのホストであることを推測する際にG ++にのみ最近追加されましたコンパイラg++は7.0以降です。 i686クロスコンパイラを新しいバージョンにアップグレードする必要があります。

+0

本当に? g ++の私の正規バージョンはclang ++ 9.0.0(私はmacOS上にあります)と私のi686-elf-g ++バージョンは6.3.0です。私は、g ++の6.3.0のドキュメントを検索する際に割り込み属性を設定しました。これは存在しない機能を文書化するのにちょっと変ですo – Adrien

+1

アップルのClang/LLVMはバージョン9以降の 'interrupt'属性しかサポートしていないようですx86/x86-64。これは、ARMやMIPSのような他のターゲットのための関数の割り込み属性をずっと長くサポートしています。 –

+1

@Adrien:GCCとCLANGは異なるプロジェクトです。 Appleには、それ以降のXCodeリリースのCLANG/LLVMの独自のバージョンがあります。 'interrupt'属性はしばらくありましたが、ARMやMIPSのようなアーキテクチャでは正しく実装されていました。最近ではGCC/CLANG/Apple CLANG(2016年頃以降)に限られています。 x86およびx86-64プラットフォーム用。 –

関連する問題