linux内核模块加载顺序分析

    科技2022-07-11  72

    linux内核模块加载顺序分析

    Linux内核中为了确定不同模块的加载顺序,通过一些宏定义了一些优先级,不同的模块通过不同的宏修饰,可以确定加载的先后顺序。 以kernel5.8.1为例,在include\linux\module.h中定义了module_init。

    // module.h #define module_init(x) __initcall(x);

    其中__initcall的定义在include\linux\init.h中。

    // init.h #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id) /* * Early initcalls run before initializing SMP. * * Only for built-in code, not modules. */ #define early_initcall(fn) __define_initcall(fn, early) /* * A "pure" initcall has no dependencies on anything else, and purely * initializes variables that couldn't be statically initialized. * * This only exists for built-in code, not for modules. * Keep main.c:initcall_level_names[] in sync. */ #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) #define fs_initcall(fn) __define_initcall(fn, 5) #define fs_initcall_sync(fn) __define_initcall(fn, 5s) #define rootfs_initcall(fn) __define_initcall(fn, rootfs) #define device_initcall(fn) __define_initcall(fn, 6) #define device_initcall_sync(fn) __define_initcall(fn, 6s) #define late_initcall(fn) __define_initcall(fn, 7) #define late_initcall_sync(fn) __define_initcall(fn, 7s) #define __initcall(fn) device_initcall(fn)

    各个不同的宏对应的等级不同,等级越小,越先加载。从以上代码可以看到subsys_initcall的定义,根据其所定义的优先级可知,其加载顺序在module_init之前。在分析input子系统时,能够看到subsys_initcall的使用。

    Processed: 0.042, SQL: 8