<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > kbuild系統(tǒng)-編譯到內(nèi)核和編譯成模塊的區(qū)別

          kbuild系統(tǒng)-編譯到內(nèi)核和編譯成模塊的區(qū)別

          作者: 時(shí)間:2012-07-30 來源:網(wǎng)絡(luò) 收藏

          代碼在代碼中有什么呢?

          本文引用地址:http://www.ex-cimer.com/article/148697.htm

          的代碼中看是一樣的。入口函數(shù)都是MODULE_init(fun),但是代碼中的條件會(huì)使宏module_init()在編譯到和編譯成的情況下替換成不同的代碼。

          include/linux/init.h中可知

          #ifndef MODULE

          ...

          #define module_init(x) __initcall(x);

          ...

          #else /* MODULE */

          ...

          /* Each module must use one module_init(), or one no_module_init */

          #define module_init(initfn)

          static inline initcall_t __inittest(void)

          { return initfn; }

          int init_module(void) __attribute__((alias(#initfn)));

          ...

          #endif

          當(dāng)代碼編譯成模塊時(shí),會(huì)定義MODULE宏,否則不會(huì)。因?yàn)樵?usr/src/linux/Makefile中可以看到

          336 MODFLAGS = -DMODULE

          337 CFLAGS_MODULE = $(MODFLAGS)

          338 AFLAGS_MODULE = $(MODFLAGS)

          這兩個(gè)變量又被export成為全局變量。所以可以知道,在編譯成模塊時(shí),會(huì)有MODULE這個(gè)宏。

          由以下代碼可以知道

          #define __initcall(fn) device_initcall(fn)

          #define device_initcall(fn) __define_initcall(6,fn)

          085 #define __define_initcall(level,fn)

          086 static initcall_t __initcall_##fn __attribute_used__

          087 __attribute__((__section__(.initcall level .init))) = fn

          前者實(shí)際上是編譯入中的.initcall6.init 這個(gè)section

          而在

          arch/i386/kernel/vmlinux.lds.S中可以知道:

          083 __initcall_start = .;

          084 .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {

          085 *(.initcall1.init)

          086 *(.initcall2.init)

          087 *(.initcall3.init)

          088 *(.initcall4.init)

          089 *(.initcall5.init)

          090 *(.initcall6.init)

          091 *(.initcall7.init)

          092 }

          093 __initcall_end = .;

          arch/i386/kernel/vmlinux.lds.S

          .initcall6.init是.initcall.init的一部分

          執(zhí)行順序:

          start_kernel->rest_init

          啟動(dòng)后在rest_init中會(huì)創(chuàng)建init內(nèi)核線程

          init->do_basic_setup->do_initcalls

          do_initcalls中會(huì)把.initcall.init中的函數(shù)依次執(zhí)行一遍

          for (call = __initcall_start; call __initcall_end; call++) {

          ...

          (*call)();

          ...

          }

          于是執(zhí)行了module_init(fn)函數(shù)



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();