マクロ読書ノートINITCALL

linux4.14.39include / linuxの/ module.h中:

#define module_init(X)__initcall(X)#define module_exit(X)__exitcall(X)

linux4.14.39 /含める/ linuxの/ init.h中:

/ *  
 *関数ポインタで指定__Initcallすべての名前が異なっている
 * / 
の#define __initcall(FN)device_initcall(FN)/ * 
 *それぞれの.cファイルすべてmodule_exit定義ためにのみ、module_exitを定義することができる
 の*静的関数ポインタが同じ名前です:__ exit_call =のFn * / の#define __exitcall(FN)静的exitcall_t __exitcall _ = ##のFnのFn __exit_call


 

linux4.14.39 /含める/ linuxの/ init.h中:

#define pure_initcall(FN)__define_initcall(FN、0)
 の#define core_initcall(FN)__define_initcall(FN、1)
 の#define core_initcall_sync(FN)__define_initcall(FN、1S)
 に#define postcore_initcall(FN)__define_initcall(FN、2)
 の#define postcore_initcall_sync(FN)__define_initcall(FN、2S)
 の#define arch_initcall(FN)__define_initcall(FN、3)
 の#define arch_initcall_sync(FN)__define_initcall(FN、3S)
 の#define subsys_initcall(FN)__define_initcall(FN、4)
 の#define subsys_initcall_sync( FN)__define_initcall(FN、4S)
 の#definefs_initcall(FN)__define_initcall(FN、5)
 の#define fs_initcall_sync(FN)__define_initcall(FN、5S)
 の#define rootfs_initcall(FN)__define_initcall(FN、rootfsの)/ * module_init()的等级是6 * / の#define device_initcall(FN )__define_initcall(FN、6)
 の#define device_initcall_sync(FN)__define_initcall(FN、6S)/ * 触摸板驱动中使用这个late_initcall * / の#define late_initcall(FN)__define_initcall(FN、7)
 の#define late_initcall_sync(FN)__define_initcall( FN、7S)





 

do_initcall_levelは()関数は(のみdo_initcallsに呼び出された)一度、それはちょうど異なる順序を呼び出し、特別な治療を行うためのINITCALL誰レベル、均等待遇の7つのレベルを言うことです。

INITCALLの7つの段階はinitcall_levelsにこの配列を格納し、()内do_initcallsに呼び出すためにすべてを一度終了します。

linux4.14.39 / initを/ main.cの:

静的 initcall_t * initcall_levels [] __initdata = { 
    __initcall0_start、
    __initcall1_start、
    __initcall2_start、
    __initcall3_start、
    __initcall4_start、
    __initcall5_start、
    __initcall6_start、
    __initcall7_start、
    __initcall_end、
}。
静的 ボイド __initのdo_initcall_level(INTのレベル)
{ 
    initcall_t * FN。

    strcpyの(initcall_command_line、saved_command_line)。

    / * 先解析命令行参数后再执行* / 
    parse_args(initcall_level_names [レベル]、
           initcall_command_line、__start___param、
           __stop___param - __start___param、
           レベル、レベル、
           NULL、 repair_env_string)。

    (FN = initcall_levels [レベル]; FN <initcall_levels [レベル+ 1 ]; FN ++ 
        do_one_initcall( * FN)。
}

静的 ボイド __initのdo_initcalls(ボイド
{ 
    int型レベル; 

    / * (late_initcall純粋/アーチ/を決定する)配列のような、小さいが最初に呼び出される* / 
    のためのレベル=(0、レベル<ARRAY_SIZE(initcall_levels) - 1。 ;レベル++ 
        do_initcall_level(レベル); 
}

 

概要

1. .cファイルには、(それが唯一の対応module_initを持つことができます)のみ1 module_exitを持つことができます。
2. INITCALLレベルmodule_initがある 6。
3.7格付けINITCALLだけ異なる順序と呼ばれる、一緒に処理されます。

 

おすすめ

転載: www.cnblogs.com/hellokitty2/p/11005513.html