linuxのメモ

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

atomic命令 - __xchg_op()

概要

2つの値を入れ替える

詳細

以下の値を引数として持つ

  • 保存先の値へのポインタ : ptr
  • 保存する値へのポインタ : arg
  • 実行する命令の種類を示す : op
    • この値にはxchgxaddのいずれかの値をとり、xaddの場合はptrargの合計値をptrに保存する
  • atomicに操作を行うか決める : lock

lockにLOCKプリフィクスを示す文字列が指定されていた場合はatomicに実行されることになるが、opxchgが指定されている場合はlockの値に関わらずatomicに実行される

また、ptrのサイズにより実行する命令に以下のsuffixが付加される

  • 1byte : b
  • 2byte : w
  • 4byte : l
  • 8byte : q

ptrのサイズが8byteを超えた場合は不正なサイズとして__op_wrong_size()が実行され、値の書き換えは行われないが、それ以外の場合はopがで示すアセンブラ命令を実行し、ptrargの値を入れ替える