linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

アセンブラ命令 - GENERIC_NOPx

概要

x86CPUで共通で使用可能なNOP命令

詳細

各数値が実行命令のバイト数を表しており、以下の命令が使用できる

  • GENERIC_NOP1
  • GENERIC_NOP2
  • GENERIC_NOP3
  • GENERIC_NOP4
  • GENERIC_NOP5
  • GENERIC_NOP6
  • GENERIC_NOP7
  • GENERIC_NOP8
  • GENERIC_NOP5_ATOMIC

それぞれの命令は以下に示すアセンブラ命令と同等である

   1        : nop;
   2        : movl %esi,%esi;
   3        : leal 0x00(%esi),%esi;
   4        : leal 0x00(,%esi,1),%esi;
   5        : nop; leal 0x00(,%esi,1),%esi;
   6        : leal 0x00000000(%esi),%esi;
   7        : leal 0x00000000(,%esi,1),%esi;
   8        : nop; leal 0x00000000(,%esi,1),%esi;
   5 atomic : dsp leal 0x00(,%esi,1),%esi;

5byteと7byteのNOP命令は2命令(nop + [4 or 7]byte命令)で形成されているためatomicに実行されない、そこで5byteのNOP命令を生成するにあたりDSセグメントへのオーバーライドプリフィックス(0x3e)を付加することで5byteの単一命令のNOPを実現している

これは、jmp命令が5byteの命令になるため自己修正コードでNOP命令を関数呼び出しに書き換える際に頻繁に利用されるため、実効速度をあげるための施策であると思います

同様な用途としてK8_NOPxK7_NOPxP6_NOPxが定義されています