亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1559 | 回復(fù): 0
打印 上一主題 下一主題

說說subsys_initcall [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-02-03 15:51 |只看該作者 |倒序?yàn)g覽
在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
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP