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だけ異なる順序と呼ばれる、一緒に処理されます。