更改内置内核驱动程序初始化的顺序?

Change the order that built in kernel drivers get initialized?

本问题已经有最佳答案,请猛点这里访问。

我的目标是嵌入式 Linux 2.6.35.3,用于飞思卡尔 iMX53 Arm CPU 板。

在内核启动过程中,当所有各种 CAN 总线相关驱动程序 (FlexCAN) 初始化并准备好使用时,我需要进行更改。我需要 CAN 总线的初始化时间比现在快得多,这样我就可以在用户空间准备好脚本执行工作之前更快地发送一些特定的 CAN 原始消息。

当编译的(内置)内核模块/驱动程序在启动和初始化序列期间被内核内部探测时,如何控制。

我不是在谈论可以在脚本中进行 mod-probed 的文件系统级别 .ko 文件。这是在此之前的方式。

对不起,我的 linux 问题格式不正确.. 我不经常在内核空间工作.. 尝试尽快解决这个问题。


initcall 顺序在这里定义:

http://lxr.free-electrons.com/source/include/linux/init.h#L194

即,供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * 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)

由于 module_init 被#defined 为 device_initcall,一个没有任何依赖关系的通用模块在序列结束时被初始化。要尽早加载模块,只需将其 module_init 调用更改为更早发生的其他内容(例如 subsys_initcall)

注意:只是切换事物的顺序可能会破坏其他依赖关系,并且您可以从地狱进入 catch-22 依赖循环。