- 論壇徽章:
- 0
|
在linux內(nèi)核代碼里, 到處充滿了subsys_initcall,這個(gè)調(diào)用是用來干嗎的呢?有人回答是系統(tǒng)啟動(dòng)時(shí)候用來初始化某些系統(tǒng)的,具體怎么初始化的呢,說起來還是有點(diǎn)復(fù)雜。以2.6.21內(nèi)核作為例子。
在linux/init.h里,有這樣一段代碼:
#define pure_initcall(fn) __define_initcall("0",fn,1)
#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)
而__define_initcall又被定義為
#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __attribute_used__ \
__attribute__((__section__(".initcall" level ".init"))) = fn
so subsys_initcall == __initcall_fn4 它將被鏈接器放于section .initcall4.init. 中
在啟動(dòng)過程中,do_basic_setup--->do_initcalls里有以下代碼:
for (call = __initcall_start; call
. .....
result = (*call)();
. ........
}
這個(gè)__initcall_start是在文件arch/xxx/kernel/vmlinux.lds.S定義的:
__initcall_start = .;
INITCALLS
__initcall_end = .;
INITCALLS被定義于asm-generic/vmlinux.lds.h:
#define INITCALLS \
*(.initcall0.init) \
*(.initcall0s.init) \
*(.initcall1.init) \
*(.initcall1s.init) \
*(.initcall2.init) \
*(.initcall2s.init) \
*(.initcall3.init) \
*(.initcall3s.init) \
*(.initcall4.init) \
*(.initcall4s.init) \
*(.initcall5.init) \
*(.initcall5s.init) \
*(.initcallrootfs.init) \
*(.initcall6.init) \
*(.initcall6s.init) \
*(.initcall7.init) \
*(.initcall7s.init)
好了,subsys_callinit應(yīng)該講清楚來龍去脈了,順便說一句,在linux/init.h里,還有這樣一段代碼:
#define core_initcall(fn) module_init(fn)
#define postcore_initcall(fn) module_init(fn)
#define arch_initcall(fn) module_init(fn)
#define subsys_initcall(fn) module_init(fn)
#define fs_initcall(fn) module_init(fn)
#define device_initcall(fn) module_init(fn)
#define late_initcall(fn) module_init(fn)
這是在定義MODULE變量的情況下對subsys_initcall的定義,就是說對于驅(qū)動(dòng)模塊,使用subsys_initcall等價(jià)于使用module_init
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:
http://blog.csdn.net/heyunqi/archive/2007/11/21/1897108.aspx
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/111397/showart_2170313.html |
|