linuxのメモ

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

アドレッシング - __phys_addr_nodebug()

概要

仮想アドレスを物理アドレスに変換する

詳細

物理アドレスを示す値xを引数として受け取り、CPUが32bitと64bitの場合で以下のように処理が異なる

  • 32bitの場合
    • xからPAGE_OFFSET*1を引いた値を返す
  • 64bitの場合
    • xから__START_KERNEL_map*2を引いた値を算出する
    • 算出した値が元の値より小さい(xがダイレクトマッピングされたカーネルアドレス空間を示している)場合は算出した値にphys_baseを加算した値を、それ以外の場合は元の値からPAGE_OFFSETを引いた値を返す

*1:仮想アドレスへのオフセット値を示し、32bitの場合初期値は0、64bitの場合は0xffff880000000000となる

*2:カーネルが配置される論理アドレスの開始アドレスを示し、有効な物理アドレスの最終番地まで2GBの地点

エラー出力 - BUG_ON()

概要

例外を発生させ、エラーが発生したコードに関するデータを登録する

詳細

CONFIG_BUGが無効な場合は引数の値を評価するだけだが、有効な場合はunlikely()で引数の値を評価し、有効な値の場合にBUG()を実行する

エラー出力 - BUG()

概要

例外を発生させ、エラーが発生したコードに関するデータを登録する

詳細

アセンブラ命令ud2で例外を発生させ、unreachable()を実行するが、CONFIG_DEBUG_BUGVERBOSEが有効な場合は、pushsectionで_bug_tableセクションにstruct bug_entry構造体のデータを挿入する

データの内容は、発生した箇所のアドレス、ファイル名、ファイル行番号で初期化される