linux内核中模块加载的顺序

2021/12/9 7:16:56

本文主要是介绍linux内核中模块加载的顺序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在//include/linux/init.h中定义了模块初始化的优先级

点击查看代码
/*
 * 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)
由于early_initcall无法使用,实际上优先级只有7级。
从中可以看出定义的初始化优先级顺序先后为

  • early_initcall
  • pure_initcall
  • core_initcall
  • postcore_initcall
  • arch_initcall
  • subsys_initcall
  • fs_initcall
  • rootfs_initcall
  • device_initcall
  • late_initcall

我们经常使用的module_init则在//include/linux/module.h中被定义为

define module_init(x) __initcall(x);

所以module_init实际上是device_initcall。在模块初始化优先级中处于倒数第二级。

具体内核调用初始化的地方在//init/main.c中
kernel_init->kernel_init_freeable->do_basic_setup->do_initcalls

具体是如何一个一个初始化各个优先级驱动的,从网上查阅的资料看是涉及到汇编,后续学习后再用一篇博客记录一下。
这里贴上一个链接,是一篇讲得比较深的博客linux的initcall机制



这篇关于linux内核中模块加载的顺序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程