will be freed after init
な領域。一瞬ココに関数定義な情報がツメコまれてるんだったらポインタの ++ 演算ってできるの? とか色々パニック。再度 __define_initcall マクロの定義を確認。
#define __define_initcall(level,fn,id) \ static initcall_t __initcall_##fn##id __attribute_used__ \ __attribute__((__section__(".initcall" level ".init"))) = fn
ええと、initcall_t は関数ポインタです。定義は include/linux/init.h にて以下。
typedef int (*initcall_t)(void);
で、上記マクロは populate_rootfs をサンプルにすると .initcallrootfs.init なセクションに populate_rootfs のポインタの領域が確保される、という記述になる、という事を確認。
上記な定義であれば __initcall_start の次から __initcall_end の前までは全部ポインタ領域になりますな。しかも include/asm-generic/vmlinux.lds.h の INITCALLS マクロにある順で取り出される事になる、というのも分かります。
この関数ポインタ配列はコメントの通りであれば will be freed after init なはずなんですが、具体的にどこで、というのは不明。関数の実体はどうなんだっけ? と思いきや、実体の定義にて __init なナニが付いてるのでこれも領域解放が保証されているはず。
static int __init populate_rootfs(void) {
このあたりも仕組みとしての抽象化、と考えて良いのでしょうか。