module init函式呼叫過程

2021-09-24 02:17:45 字數 2266 閱讀 7028

include/linux/init.h

#define define early_initcall(fn)		__define_initcall(fn, early)

/* * a "pure" initcall has no dependencies on anything else, and purely

* initializes variables that couldn't be statically initialized.

* * this only exists for built-in code, not for modules.

* keep main.c:initcall_level_names in sync.

*/#define pure_initcall(fn) __define_initcall(fn, 0)

#define core_initcall(fn) __define_initcall(fn, 1)

#define core_initcall_sync(fn) __define_initcall(fn, 1s)

#define postcore_initcall(fn) __define_initcall(fn, 2)

#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)

#define arch_initcall(fn) __define_initcall(fn, 3)

#define arch_initcall_sync(fn) __define_initcall(fn, 3s)

#define subsys_initcall(fn) __define_initcall(fn, 4)

#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)

#define fs_initcall(fn) __define_initcall(fn, 5)

#define fs_initcall_sync(fn) __define_initcall(fn, 5s)

#define rootfs_initcall(fn) __define_initcall(fn, rootfs)

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

#define device_initcall_sync(fn) __define_initcall(fn, 6s)

#define late_initcall(fn) __define_initcall(fn, 7)

#define late_initcall_sync(fn) __define_initcall(fn, 7s)

#define __initcall(fn) device_initcall(fn)

include/linux/module.h 

#define module_init(x)	__initcall(x);
module_init相當於__define_initcall(fn, 6),編譯的時候,相應的函式會放在不同的段(

init/main.c

asmlinkage __visible void __init start_kernel(void)

static noinline void __ref rest_init(void)

static int __ref kernel_init(void *unused)

static noinline void __init kernel_init_freeable(void)

static void __init do_basic_setup(void)

static void __init do_initcalls(void)

static void __init do_initcall_level(int level)

int __init_or_module do_one_initcall(initcall_t fn)

static int __init_or_module do_one_initcall_debug(initcall_t fn)

這裡的duration右移10位(除與1024,實際上應該除與1000),應該是以效率考慮的。

如果cmdline定義了initcall_debug,則會將函式的執行時間列印出來。

總結:利用這個表可以調整驅動載入順序

函式呼叫過程

每乙個未執行完的函式都對應著乙個棧幀,系統為單個函式分配的那部分棧空間就叫做棧幀,棧幀儲存了函式的資訊。以下面的 為例,通過彙編 的執行過程介紹棧幀建立和銷毀的過程 include int add int x,int y int main 從main函式建立自己的棧幀開始 其他內容先忽略 初始狀態 ...

函式呼叫過程

c語言種有三種迴圈 do.while while for 初始化 條件判斷 步進 主函式 main 庫函式自定義函式函式的發明,使得變成可以以函式為單位進行模組化,叫做面向過程。軟體工程中,有 高內聚,低耦合 的要求。函式就是為了實現以上要求發明的產物。函式是面向過程的 介面 其介面包含了 引數 返...

函式呼叫過程

引數代入順序 引數入棧的順序是從右向左入棧的。8位元組的引數代入 push入棧的方式將引數傳遞 8位元組的引數代入 先在main函式的棧頂向上移動12位元組,然後將引數的資料拷貝到main函式棧頂開闢的記憶體。int fun1 int a,int b int main 第一步進行函式引數入棧,如圖 ...