module_init()などの順番

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

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

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)

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

```


/*

* 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.

*/

define pureinitcall(fn) _define_initcall("0",fn,0)```

define coreinitcall(fn) _define_initcall("1",fn,1)

#define coreinitcallsync(fn) _defineinitcall("1s",fn,1s)
#define postcoreinitcall(fn) _defineinitcall("2",fn,2)
#define postcore
initcallsync(fn) _defineinitcall("2s",fn,2s)
#define arch
initcall(fn) _defineinitcall("3",fn,3)
#define archinitcallsync(fn) _defineinitcall("3s",fn,3s)
#define subsysinitcall(fn) _defineinitcall("4",fn,4)
#define subsys
initcallsync(fn) _defineinitcall("4s",fn,4s)
#define fs
initcall(fn) _defineinitcall("5",fn,5)
#define fsinitcallsync(fn) _defineinitcall("5s",fn,5s)
#define rootfsinitcall(fn) _defineinitcall("rootfs",fn,rootfs)
#define device
initcall(fn) _defineinitcall("6",fn,6)
#define deviceinitcallsync(fn) _defineinitcall("6s",fn,6s)
#define lateinitcall(fn) _defineinitcall("7",fn,7)
#define late
initcallsync(fn) _define_initcall("7s",fn,7s)

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

cat /proc/kallsyms | sort | grep __initcall

以上