linuxのメモ

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

memory

メモリ割り当て - memset()

概要 任意の大きさのメモリを初期化する 詳細 CONFIG_X86_32が有効(32bitモード) __KERNEL__が定義済み(カーネル内の呼び出し) __GNUC__のバージョンが4以上 コンパイラのデフォルト関数である__builtin_memset()を実行 4未満 __builtin_constant_p()でセッ…

メモリ割り当て - __constant_c_x_memset()

概要 任意の大きさのメモリを初期化する 詳細 このマクロでは以下の引数を受け取る 初期化するメモリのアドレスを示す : s 初期化する値のアドレスを示す : c 初期化するメモリの大きさを示す : count __builtin_constant_p()関数でcountの値が定数か確認し…

メモリ割り当て - __constant_c_memset()

概要 任意の大きさのメモリを初期化する 詳細 この関数では以下の引数を受け取る 初期化するメモリへのポインタ : s 初期化する値へのポインタ : c 初期化するメモリの大きさ : count 拡張インラインアセンブラで以下の処理を行う sをediレジスタに、cをeax…

メモリ割り当て - __constant_c_and_count_memset()

概要 任意の大きさのメモリを初期化する 詳細 この関数では以下の引数を受け取る 初期化するメモリへのポインタ : s 初期化する値へのポインタ : pattern 初期化するメモリの大きさ : count countの値が0 - 4の場合は、sのアドレスの値をpatternの値でcount…

メモリ割り当て - __memset()

概要 任意の大きさのメモリを初期化する 詳細 このマクロでは以下の引数を受け取る 初期化するメモリのアドレスを示す : s(rdiレジスタ) 初期化する値のアドレスを示す : c(rsiレジスタ) 初期化するメモリの大きさを示す : count(rdxレジスタ) レジスタへの…

メモリ割り当て - __constant_count_memset()

概要 任意の大きさのメモリを初期化する 詳細 __memset_generic()のwrapperマクロ

メモリ割り当て - __memset_generic()

概要 任意の大きさのメモリを初期化する 詳細 この関数では以下の引数を受け取る 初期化するメモリのアドレスを示す : s 初期化する値のアドレスを示す : c 初期化するメモリの大きさを示す : count 拡張インラインアセンブラにより引数を以下のようにレジス…

メモリ割り当て - memset_erms()

概要 rdiレジスタの指すアドレスからrdxレジスタの値分のメモリを初期化する 詳細 最初に以下の操作を行い処理の準備を行う rdiレジスタに格納されている保存先のアドレスをr9レジスタに退避 対象の文字列へのアドレスが保持されているsilレジスタ(rsiレジス…

メモリ割り当て - memset_orig()

概要 rdiレジスタの指すアドレスからrdxレジスタの値分のメモリを初期化する 詳細 1: ecxレジスタにsilレジスタの値を、raxレジスタに0x0101010101010101とsilレジスタの値の積をそれぞれ保存し、rdiレジスタの下位3bitが0でなければ以下の処理を行う rdxレ…

メモリ割り当て - kmalloc_slab()

概要 パラメータのサイズに応じた大きさのkmem_cache構造体を返す 詳細 メモリの割当要求サイズ(size)に応じて以下のとおりに処理内容が変わる size == 0 ZERO_SIZE_PTRを返す 0 < size <= KMALLOC_MAX_SIZE size <= 192 sizeを元にsize_index配列から適切な…