linuxのメモ

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

atomic操作 - __read_once_size

概要

指定された値を指定されたsizeでatomicに読み込む

詳細

__READ_ONCE_SIZEマクロを展開し実行する __READ_ONCE_SIZEマクロは以下の変数が宣言されている前提で実行する

  • 値のsizeを示すsize
  • 読込元の値のポインタを示すp
  • 返り値のポインタを示すres

また、sizeによって処理が変わるが、大きく以下の2種類に別れる

  • sizeが8バイト以下
    • pの値をvolatile修飾子で最適化を抑制した状態で返り値resに代入する
  • sizeが8バイト以上
    • *1__builtin_memcpy()pの値をresにコピーするが実行前と実行後にbarrier()を実行することで、コピー時のpの値が現在設定されている値であること、コピー後のresの値がコピーした値であることを保証している

*1:gcc組込みのメモリコピー関数