linuxのメモ

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

メモリ割り当て - memset()

概要

任意の大きさのメモリを初期化する

詳細

  • CONFIG_X86_32が有効(32bitモード)
    • __KERNEL__が定義済み(カーネル内の呼び出し)
      • __GNUC__のバージョンが4以上
        • コンパイラのデフォルト関数である__builtin_memset()を実行
      • 4未満
        • __builtin_constant_p()でセットする文字列が定数か確認し、定数なら__constant_c_x_memset()を、定数でなければ__memset()を実行する
        • 定数の場合は初期化する値は0x01010101UL*1をかけた値を使用する
    • カーネル以外からの呼び出し __memset() を実行しEXPORT_SYMBOL()によりモジュールからアクセス可能なシンボルとなる
  • CONFIG_X86_32が無効(64bitモード)
    • __KERNEL__が定義済み
      • CONFIG_KASANが有効で、かつ__SANITIZE_ADDRESS__が無効な場合に処理が異なるように見えるが、64bitの場合はこの関数と __memset() は全く同じ処理となる

*1:この値でかけることにより4バイト分1バイトの値を繰り返した値になる