日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]kbuild系統(tǒng)-編譯到內(nèi)核和編譯成模塊的區(qū)別

代碼編譯內(nèi)核和編譯成模塊在代碼中有什么區(qū)別呢?

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

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í)際上是編譯入內(nèi)核中的.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

系統(tǒng)啟動(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ù)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉