2017-06-25 27 views
2

CPUが、CPUがサポートしていない命令でコンパイルされたバイナリを実行しようとするとどうなりますか?私は、古いプロセッサで動作する新しいAVX命令のいくつかについて特に疑問を抱いています。CPUがサポートしていない命令を実行するとどうなりますか?

私は、これはについて試験することができると仮定していて、優しいメッセージが理論的には、ユーザに表示することができます。おそらく、ほとんどの低レベルライブラリがあなたのためにこれをチェックします。このチェックをしなかったと仮定すると、何が起こると思いますか?あなたのプロセスはどのようなシグナルを受け取りますか?

+1

[シグナル 'SIGILL'の原因は何ですか?](https://stackoverflow.com/q/7901867/608639)とお友達。私が知る限り、i386、x86_64、ARM、Aarch32、Aarch64、MIPSなど、すべてのLinuxプラットフォームで 'SIGILL 'が呼び出されています。 – jww

+0

* "おそらく、ほとんどの低レベルライブラリがあなたの代わりにこれをチェックします。" *私はそうは思わない。潜在的にサポートされていない命令を使用するほとんどの低レベルライブラリは、他のどの速度よりも速いためにそうしています。下位レベルのコードを呼び出す前に*これらの命令がサポートされているかどうかを確認するのは、上位レベルのコードの責任です。必要な命令セットが実行される前に*サポートされていることを検証するために 'CPUID'命令(ほとんどのコンパイラでは組み込み関数として公開)を使用して、無効な命令例外のリスクを回避します。フレンドリーなエラーメッセージを表示してください。 –

+1

火を止めて発砲します。 –

答えて

6

新しい命令は、「互換性のあるレガシー」またはそれができないように設計することができます。かつてのクラスに
tzcnt歳以上のアーキテクチャでは、有効な指示を生成エンコーディングを持ってxacquireよう指示を所属:tzcntrep bsfxacquireとしてエンコードされたばかりrepneです。
意味はもちろん違います。第二のクラスに

は、AVXは1つの人気の例である、新しい命令の大半を属します。
CPUが無効であるか、それが#UD未定義ための)例外を生成エンコード予約に遭遇したとき - それは6

割り込み番号のLinuxカーネルが早いentry_64.S#UDためIDTエントリを設定:traps.cマクロで生成されdo_invalid_op

idtentry invalid_op   do_invalid_op   has_error_code=0 

エントリポイント:

DO_ERROR(X86_TRAP_UD,  SIGILL, "invalid opcode",  invalid_op) 

マクロDO_ERRORは、同じファイル(here)にdo_error_trapを呼び出す関数を生成します。

do_error_trap Linuxの信号情報を含むsiginfo_t構造を作成するために、(同じファイル、hereで)fill_trap_infoを使用しています。

case X86_TRAP_UD: 
    sicode = ILL_ILLOPN; 
    siaddr = uprobe_get_trap_addr(regs); 
    break; 

そこから次のコールが起こる:traps.c force_sig_info

do_trapsignal.c

signal.c specific_send_sig_info最終的に問題のあるプロセスの SIGILLのためのシグナルハンドラを呼び出すことで絶頂に達する


次のプログラムは、我々は、そのプログラムを実行することにより、受信した信号をチェックするstraceを使用することができ#UD

BITS 64 

GLOBAL _start 

SECTION .text 

_start: 

ud2 

を生成する非常に単純な例である

--- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPN, si_addr=0x400080} --- 
+++ killed by SIGILL +++ 

として期待される。


Cody Gray commentedとして、ライブラリは通常、代わりに、彼らはCPU dispatcherを使用し、SIGILLに依存しているか、明示的に指示の有無をチェックしません。

関連する問題