亚洲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