Linux核心模組靜態載入的順序

2021-09-29 05:59:47 字數 2332 閱讀 4649

linux驅動先註冊匯流排,匯流排上可以先掛device,也可以先掛driver,那麼究竟怎麼控制先後的順序呢?

linux系統使用兩種方式去載入系統中的模組:動態和靜態。

靜態載入:將所有模組的程式編譯到linux核心中,由do_initcall函式載入

核心程序(/init/main.c)kernel_init do_basic_setup() do_initcalls()該函式中會將在__initcall_start和__initcall_end之間定義的各個模組依次載入。

/arch/powerpc/kernel/vmlinux.lds檔案,找到.initcall.init段:

.initcall.init :
#define pure_initcall(fn)              __define_initcall("0",fn,0)

#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)

module_init(fbtft_driver_module_init);   

#define module_init(x) __initcall(x);

#define __initcall(fn) device_initcall(fn)

//我們平時用的module_init在靜態編譯時就相當於device_initcall。

可以在最新的**版本檢視 device_initcall 等的定義

舉個例子,在2.6.24的核心中:

gianfar_device使用的是arch_initcall,而gianfar_driver使用的是module_init,

因為arch_initcall的優先順序大於module_init,所以gianfar裝置驅動的device先於driver在匯流排上新增。

c0949ba4 t __initcall_hid_init6

c0949ba8 t __initcall_fbtft_driver_module_init6

c0949bac t __initcall_flexfb_init6

c0949bb0 t __initcall_extcon_class_init6

這裡鏈結的順序,即是initcall list裡呼叫的順序。

而鏈結的順序和makefile裡的順序有關。

比如fbtft的makefile中, fbtft 就排在 flexfb的前面。

linux 核心模組載入 HelloWorld

1。建立hello目錄 mkdir hello 2。進入hello目錄 cd hello 3。編寫hello.c include include module license gpl static int hello init void static void hello exit void mod...

linux核心可載入模組的makefile

在開發linux核心驅動時,免不了要接觸到makefile的編寫和修改,儘管網上的makefile模板一大堆,做一些簡單的修改就能用到自己的專案上,但是,對於這些基礎的東西,更應該做到知其然並知其所以然。本篇文章中只討論linux核心模組編譯的makefile,linux核心makefile總覽可以...

Linux核心模組自動載入機制

提交者 addylee 日期 2008 10 8 22 50 閱讀 636 www.osplay.org 摘要 本文討論了linux核心中udevd的模組自動載入機制。標題 思 考 如果想讓核心啟動過程中自動載入某個模組 該怎麼做呢?最容易想到的方法就是到 etc init.d 中新增乙個啟動指令碼...