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

Change the order that built in kernel drivers get initialized?

我的目标是用于 Freescale iMX53 Arm CPU 开发板的嵌入式 Linux 2.6.35.3。

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

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

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

抱歉我的问题格式不正确 linux.. 我不经常在内核中工作 space.. 尝试尽快解决这个问题。

initcall 顺序在这里定义:

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

即,供参考:

/*
 * 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 依赖循环。