今までよくわからずに使っていましたが、module_init()などの順番が気になったので調べてみました。

module_init()や、subsys_initcall()など、初期化時に実行させる為の文言がいくつかあります。が、これらの優先順位を知りたくなりました。

module_init は、以下のファイルでプリプロセッサとして定義されています。
include/linux/init.h
http://lxr.linux.no/#linux+v2.6.35/include/linux/init.h

#define module_init(x) __initcall(x);

この__initcallは、同ファイルで定義されていて、次のようになります。
#define __initcall(fn) device_initcall(fn)

さらにコードを遡ると、このようなマクロ群がある事がわかります。

<br></br> /*<br></br> * A "pure" initcall has no dependencies on anything else, and purely<br></br> * initializes variables that couldn't be statically initialized.<br></br> *<br></br> * This only exists for built-in code, not for modules.<br></br> */<br></br> #define pure_initcall(fn) __define_initcall("0",fn,0)

#define core_initcall(fn) __define_initcall(“1”,fn,1)
#define core_initcall_sync(fn) __define_initcall(“1s”,fn,1s)
#define postcore_initcall(fn) __define_initcall(“2”,fn,2)
#define postcore_initcall_sync(fn) __define_initcall(“2s”,fn,2s)
#define arch_initcall(fn) __define_initcall(“3”,fn,3)
#define arch_initcall_sync(fn) __define_initcall(“3s”,fn,3s)
#define subsys_initcall(fn) __define_initcall(“4”,fn,4)
#define subsys_initcall_sync(fn) __define_initcall(“4s”,fn,4s)
#define fs_initcall(fn) __define_initcall(“5”,fn,5)
#define fs_initcall_sync(fn) __define_initcall(“5s”,fn,5s)
#define rootfs_initcall(fn) __define_initcall(“rootfs”,fn,rootfs)
#define device_initcall(fn) __define_initcall(“6”,fn,6)
#define device_initcall_sync(fn) __define_initcall(“6s”,fn,6s)
#define late_initcall(fn) __define_initcall(“7”,fn,7)
#define late_initcall_sync(fn) __define_initcall(“7s”,fn,7s)

これが、優先順位そのものとなります。module_init()の正体であるdevice_initcall()は、順位6である事がわかります。
これ以降は割愛しますが、この後さらにプリプロセッサを行い、初期化の為の特別なシンボルを作ります。
_initcall
最終的に、このシンボルは、初期化が実行される順番通りにメモリにならびます。
これらのシンボルが並んだ様子は、実機で、以下のコマンドで見る事ができます。

cat /proc/kallsyms | sort | grep __initcall

以上