linuxのメモ

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

bit操作 - find_last_bit()

概要

ビットマップ配列内でビットが1になっている最も大きな位置を取得する

詳細

この関数では以下の引数を取得する

  • ビットマップの配列へのポインタ : addr
  • ビットマップの大きさを示す : size

全ての配列の値と対応するビットマスクの論理積をとり、共通のビットが立っていた場合は配列のインデックスとBITS_PER_LONGの積に__fls()で配列の値からビットが1になっている最も大きな位置を取得し、その値を加算した値を返すことでビットマスクを示す配列内でビットが1になっている最も大きな位置を得ることができる

尚、配列の値は配列の末尾の要素から先頭に向かって進むため途中で返り値を返しても適切な値を返すことになる

そのため、ビットマスクは最初の比較時はBITMAP_LAST_WORD_MASK()sizeを渡してsizeBITS_PER_LONG以下のビットマスクを取得するが、二回目以降は0ULのビットを反転した値(全てのビットが1の値)がビットマスクとなる

また、ビットマップの配列の全ての値が0の場合はsizeの値を返し*1EXPORT_SYMBOL()によりモジュールからアクセス可能な値となる

*1:この値は最初の比較で返す値と同じ値になる