年の瀬に

悪足掻き。確認対象は init/main.c の中で定義されている init() 手続きです。参考書 (Linux カーネル 2.6 解読室)見つつ。

populate_rootfs 関数

上記参考書によれば init() 関数の中で直接呼び出されているんですが、2.6.20 な kernel ではそれがありません。
むむむ、と言いつつ init/initramfs.c を見ると関数定義されている様子。しかもソースのいっちゃん下にて

rootfs_initcall(populate_rootfs);

で、上記マクロは include/linux/init.h にて定義されてる云々は一昨日のエントリで色々ナニ。ただ、__initcall マクロに関するナニについてドキュメントのポインタを付けてますが、これって 2.4 なカーネルに関する記述である事が判明。
とりあえず include/linux/init.h によれば

  • __initcall は device_initcall マクロで置換
#define __initcall(fn) device_initcall(fn)
  • device_initcall は以下の定義
#define device_initcall(fn)		__define_initcall("6",fn,6)

参考書 (Linux カーネル 2.6 解読室)によると

  • 2.4 では __initcall マクロのみで一段階のみ
  • 2.6 では優先度が付けられて (七段階) マクロの第一引数の値の昇順で実行
  • 2.6.20 では sync が付いたのが追加されてさらに増えてる

というカンジになっている模様。ちなみに rootfs_initcall は以下な定義。

#define rootfs_initcall(fn)		__define_initcall("rootfs",fn,rootfs)

これって一体何番目なんでしょ (謎
一昨日エントリでマクロ置換後のナニを出してるんですが、参考書 (Linux カーネル 2.6 解読室)によると init/main.c にて定義されている do_initcalls() 手続きにて使用されている __initcall_start が指す配列に

指定した関数のアドレスが格納される仕組みになっています。これはコンパイラなどの機能を利用したもので、カーネルの make 時に作られます。

との事。結構コアな gcc ハックを使っていそうな予感。今から確認予定ッスがスルーして核心部分に進む可能性もあり。
# もっと言えばこのまま fadeout な可能性も大 (を