linuxのメモ

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

2016-03-11から1日間の記事一覧

準仮想化 - paravirt_clobber()

概要 インラインアセンブラのオペランドを定義する 詳細 アセンブラのオペランドとして以下の名前と値を定義する 名前 値 [paravirt_clobber] 引数で取得した値を割り当てる

準仮想化 - paravirt_type()

概要 インラインアセンブラのオペランドを定義する 詳細 アセンブラのオペランドとして以下の名前と値を定義する 名前 値 [paravirt_typenum] PARAVIRT_PATCH()で取得した値を割り当てる [paravirt_opptr] 引数で取得した値のアドレスを割り当てる

準仮想化 - PARAVIRT_PATCH()

概要 paravirt_patch_template構造体のメンバを示すindexを取得する 詳細 offsetof()でparavirt_patch_template構造体のメンバのoffset値を取得し、この値をvoidのサイズで割ることで指定したメンバのindexを得る

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

概要 構造体に含まれるメンバのoffsetを取得する 詳細 __compiler_offsetof()が定義されている場合は__compiler_offsetof()を実行するが、未定義の場合は以下の処理で算出する 構造体をアドレス0から始まるポインタとして定義し、メンバ変数のアドレスを取得…

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

概要 構造体に含まれるメンバのoffsetを取得する 詳細 GCCのバージョンが4以上の場合に定義されるため、3以下の場合は未定義となる 定義される場合は__builtin_offsetof()のwrapperとなり、GCCに含まれる標準関数を実行する

アセンブラ命令 - _ASM_PTR

asm

概要 アセンブラ命令内で定義するデータのサイズを指定するための文字列を生成する 詳細 __ASM_SEL()を使用して、CONFIG_X86_32が有効な場合はlong、無効な場合はquadのサイズのデータを指定する文字列を生成する

アセンブラ命令 - _ASM_ALIGN

asm

概要 アセンブラ命令をアライメントするための文字列を生成する 詳細 __ASM_SEL()を使用して、CONFIG_X86_32が有効な場合は4bite、無効な場合は8biteのアライメントを指定する文字列を生成する

アセンブラ命令 - __ASM_SEL()

asm

概要 CPUのアーキテクチャに応じて適切なアセンブラの文字列を生成する 詳細 CONFIG_X86_32が有効な場合は第一引数を、それ以外の場合は第二引数を__ASM_FORM()に渡して実行する

アセンブラ命令 - __ASM_FORM()

asm

概要 引数の値を文字列に変換する 詳細 引数の値を文字列として前後に空白文字を連結した文字列を作る

割込み処理 - native_irq_disable()

irq

概要 CPUの割込みを無効化する 詳細 アセンブラ命令のcli命令を実行し、CPUの割込み処理を無効化する

アドレッシング - __va()

概要 物理アドレスを仮想アドレスに変換する 詳細 取得した物理アドレスを示す値にPAGE_OFFSETを加算して仮想アドレスに変換する PAGE_OFFSETから64TBのアドレス範囲は物理アドレスのマッピングを管理するアドレス空間になっているため、上記の操作で物理ア…

アドレッシング - phys_to_virt()

概要 物理アドレスを仮想アドレスに変換する 詳細 __va()マクロのwrapper

アドレッシング - is_ISA_range()

概要 アドレスの範囲がISAのアドレス範囲内にあるか確認する 詳細 開始アドレスと終了アドレスを引数として取得し、開始アドレスがISA_START_ADDRESSより大きく、終了アドレスがISA_END_ADDRESSより小さければ1を返し、それ以外の場合は0を返す