kbuild系統 編譯到核心和編譯成模組的區別

2021-05-26 19:49:36 字數 1624 閱讀 3520

**編譯到核心和編譯成模組在**中有什麼區別呢?

從模組的**中看是一樣的。入口函式都是module_init(fun),但是**中的條件編譯會使巨集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) \

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

#endif

當**編譯成模組時,會定義module巨集,否則不會。因為在/usr/src/linux/makefile中可以看到

336 modflags = -dmodule

337 cflags_module = $(modflags)

338 aflags_module = $(modflags)

這兩個變數又被export成為全域性變數。所以可以知道,在編譯成模組時,會有module這個巨集。

由以下**可以知道

#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

前者實際上是編譯入核心中的.initcall6.init 這個section

而在arch/i386/kernel/vmlinux.lds.s中可以知道:

083 __initcall_start = .;

084 .initcall.init : at(addr(.initcall.init) - load_offset)

093 __initcall_end = .;

arch/i386/kernel/vmlinux.lds.s

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

執行順序:

start_kernel->rest_init

系統啟動後在rest_init中會建立init核心執行緒

init->do_basic_setup->do_initcalls

do_initcalls中會把.initcall.init中的函式依次執行一遍

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

(*call)();

於是執行了module_init(fn)函式

kbuild系統 編譯到核心和編譯成模組的區別

編譯到核心和編譯成模組在 中有什麼區別呢?從模組的 中看是一樣的。入口函式都是module init fun 但是 中的條件編譯會使巨集module init 在編譯到核心和編譯成模組的情況下替換成不同的 include linux init.h中可知 ifndef module define mo...

驅動程式 編譯進核心和編譯成模組

在 核心中增加程式需要完成以下五項工作 1.將編寫的源 複製到 linux 核心源 的相應目錄 2.在目錄的 kconfig 檔案中增加新源 對應專案的編譯配置選項 3.在目錄的 makefile 檔案中增加對新源 的編譯條目。4.在該目錄的上一級目錄的kconfig檔案中把上面第二步修改的kcon...

我的ubuntu新核心編譯成功

我的ubuntu新核心2.6.21.5編譯成功 現在來分享下步驟 step 1 準備工作 安裝需要的工具 build essential 基本的程式設計庫 gcc,make等 kernel package libncurses5 dev meke menuconfig要呼叫的 libqt3 head...