亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
說(shuō)說(shuō)subsys_initcall
[打印本頁(yè)]
作者:
sayou678
時(shí)間:
2010-02-03 15:51
標(biāo)題:
說(shuō)說(shuō)subsys_initcall
在linux內(nèi)核代碼里, 到處充滿了subsys_initcall,這個(gè)調(diào)用是用來(lái)干嗎的呢?有人回答是系統(tǒng)啟動(dòng)時(shí)候用來(lái)初始化某些系統(tǒng)的,具體怎么初始化的呢,說(shuō)起來(lái)還是有點(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)過(guò)程中,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)該講清楚來(lái)龍去脈了,順便說(shuō)一句,在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變量的情況下對(duì)subsys_initcall的定義,就是說(shuō)對(duì)于驅(qū)動(dòng)模塊,使用subsys_initcall等價(jià)于使用module_init
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://blog.csdn.net/heyunqi/archive/2007/11/21/1897108.aspx
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):
http://blog.chinaunix.net/u3/111397/showart_2170313.html
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2