linuxのメモ

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

アドレッシング - is_vmalloc_addr()

概要 アドレスが、vmallocのアドレスの範囲内であるか確認する 詳細 CONFIG_MMUが無効な場合は常に0を返すが、有効な場合は引数として取得したアドレスの値がVMALLOC_STARTからVMALLOC_ENDの範囲内にあるか確認する

アドレッシング - __phys_addr_nodebug()

概要 仮想アドレスを物理アドレスに変換する 詳細 物理アドレスを示す値xを引数として受け取り、CPUが32bitと64bitの場合で以下のように処理が異なる 32bitの場合 xからPAGE_OFFSET*1を引いた値を返す 64bitの場合 xから__START_KERNEL_map*2を引いた値を算…

エラー出力 - VIRTUAL_BUG_ON()

概要 例外を発生させ、エラーが発生したコードに関するデータを登録する 詳細 CONFIG_DEBUG_VIRTUALが無効な場合は何も実行しないが、有効な場合はBUG_ON()を実行する

エラー出力 - BUG_ON()

概要 例外を発生させ、エラーが発生したコードに関するデータを登録する 詳細 CONFIG_BUGが無効な場合は引数の値を評価するだけだが、有効な場合はunlikely()で引数の値を評価し、有効な値の場合にBUG()を実行する

エラー出力 - BUG()

概要 例外を発生させ、エラーが発生したコードに関するデータを登録する 詳細 アセンブラ命令ud2で例外を発生させ、unreachable()を実行するが、CONFIG_DEBUG_BUGVERBOSEが有効な場合は、pushsectionで_bug_tableセクションにstruct bug_entry構造体のデータ…

ユーティリティー - unreachable()

概要 呼び出し元のコードに従って適切な返り値を設定する 詳細 GCCのバージョンが4.5以上の場合はコンパイラに組み込まれた_builtin_unreachable()関数を実行し呼び出し元のコードに従って適切な返り値を設定するが、それ以外の場合は何も実行しないマクロと…

アドレッシング - pfn_to_page()

概要 ページフレーム番号から該当するページのアドレスを取得する 詳細 __pfn_to_page()のwrapperマクロ

アドレッシング - __pfn_to_page()

概要 ページフレーム番号から該当するページのアドレスを取得する 詳細 このマクロではページフレーム番号を示すpfnを引数として受け取り、カーネルコンフィグオプションによって以下のように処理が異なる(優先度順) CONFIG_FLATMEMが有効 mem_mapで示される…

アドレッシング - __section_mem_map_addr()

概要 セクションのデータからページのデータへのアドレスを取得する 詳細 引数で受け取ったstruct mem_section型のセクションのデータからsection_mem_mapメンバの値を取得する 取得した値とSECTION_MAP_MASKの論理積で算出されるアドレスをページのデータが…

アドレッシング - __pfn_to_section()

概要 ページフレーム番号からセクションのデータを取得する 詳細 pfn_to_section_nr()でページフレームからセクション番号を取得し、__nr_to_section()でセクション番号からセクションのデータを取得する

アドレッシング - __nr_to_section()

概要 セクション番号に一致するセクションのデータを取得する 詳細 SECTION_NR_TO_ROOT()にセクション番号を渡して取得したインデックスがmem_section配列で無効な値の場合はNULLを返す それ以外の場合は二次元配列であるmem_sectionから取得したインデック…

アドレッシング - SECTION_NR_TO_ROOT()

概要 セクションのルート番号を取得する 詳細 セクション番号をSECTIONS_PER_ROOTで割ることでセクションが含まれるルート番号を取得する

アドレッシング - pfn_to_section_nr()

概要 ページフレーム番号からセクション番号を取得する 詳細 ページフレーム番号をPFN_SECTION_SHIFTビット右にシフトし、セクション番号を取得する

アドレッシング - arch_local_page_offset()

概要 ノード内のページのオフセット値を取得する 詳細 このマクロでは以下の引数を受け取る ページフレーム番号を示す : pfn ノード番号を示す : nid NODE_DATA()にnidを渡してノードのデータを取得する 取得したデータのnode_start_pfnのメンバをpfnの値か…

NUMA - NODE_DATA()

概要 ノードのデータを取得する 詳細 同名の配列から指定したノードIDの値を取得する 配列は MAX_NUMNODES 個の要素を持つstruct pglist_data型の配列で、EXPORT_SYMBOL()によりモジュールからアクセス可能なシンボルとなる

NUMA - arch_pfn_to_nid()

概要 ページフレーム番号からノードIDを取得する 詳細 pfn_to_nid()のwrapperマクロ

NUMA - pfn_to_nid()

概要 ページフレーム番号からノードIDを取得する 詳細 CONFIG_NUMAが未定義の場合は常に0を返すが、定義されている場合はphysnode_mapから引数の値をPAGES_PER_SECTIONで割った値番目の要素を取得しint型の値として返す

NUMA - physnode_map

概要 ノードのページフレーム番号を保持する配列 詳細 MAX_SECTIONS個の要素を持ち、すべての要素が-1で初期化される変数で、EXPORT_SYMBOL()によりモジュールからアクセス可能なシンボルとなる

メモリ割り当て - 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レ…

エラー出力 - BUILD_BUG_ON()

概要 コンパイル時にエラーを出力する 詳細 __CHECKER__と__OPTIMIZE__の値によって以下のように処理が異なる __CHECKER__が有効 何もしない __OPTIMIZE__が有効 ((void)sizeof(char[1 - 2*!!(condition)]))のコードにより、conditionが0以外の場合にコンパ…

エラー出力 - BUILD_BUG_ON_MSG()

概要 コンパイル時に任意のメッセージでエラーを出力する 詳細 このマクロでは以下の引数を受け取る 状態を示す : cond 表示するメッセージを示す : msg __CHECKER__が有効な場合は何も実行しないが、無効な場合はcompiletime_assert()にcondの否定した値とm…

バッファ操作 - rb_event_set_padding()

概要 イベントのpaddingを初期化する 詳細 引数として受け取ったstruct ring_buffer_event構造体に以下のデータを保存しイベントのpaddingを初期化する type_lenメンバにRINGBUF_TYPE_PADDING time_deltaメンバに0