新しい命令は、「互換性のあるレガシー」またはそれができないように設計することができます。かつてのクラスに
はtzcnt
歳以上のアーキテクチャでは、有効な指示を生成エンコーディングを持ってxacquire
よう指示を所属:tzcnt
は rep bsf
とxacquire
としてエンコードされたばかり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_trap
でsignal.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に依存しているか、明示的に指示の有無をチェックしません。
[シグナル 'SIGILL'の原因は何ですか?](https://stackoverflow.com/q/7901867/608639)とお友達。私が知る限り、i386、x86_64、ARM、Aarch32、Aarch64、MIPSなど、すべてのLinuxプラットフォームで 'SIGILL 'が呼び出されています。 – jww
* "おそらく、ほとんどの低レベルライブラリがあなたの代わりにこれをチェックします。" *私はそうは思わない。潜在的にサポートされていない命令を使用するほとんどの低レベルライブラリは、他のどの速度よりも速いためにそうしています。下位レベルのコードを呼び出す前に*これらの命令がサポートされているかどうかを確認するのは、上位レベルのコードの責任です。必要な命令セットが実行される前に*サポートされていることを検証するために 'CPUID'命令(ほとんどのコンパイラでは組み込み関数として公開)を使用して、無効な命令例外のリスクを回避します。フレンドリーなエラーメッセージを表示してください。 –
火を止めて発砲します。 –