Linux 裝置和驅動載入的先後順序

2021-06-18 03:45:07 字數 2869 閱讀 7988

linux驅動先註冊匯流排,匯流排上可以先掛

device

,也可以先掛

driver

,那麼究竟怎麼控制先後的順序呢。

linux

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

靜態載入:將所有模組的程式編譯到

linux

核心中,由

do_initcall

函式載入

核心程序(

/init/main.c

)kernel_init

àdo_basic_setup()

àdo_initcalls

()該函式中會將在

__initcall_start

和__initcall_end

之間定義的各個模組依次載入。那麼在

__initcall_start 

和__initcall_end

之間都有些什麼呢?

找到

/arch/powerpc/kernel/vmlinux.lds

檔案,找到

.initcall.init

段:

.initcall.init :

可以看出在這兩個巨集之間依次排列了

14個等級的巨集,由於這其中的巨集是按先後順序鏈結的,所以也就表示,這

14個巨集有優先順序:

0>1>1s>2>2s………>7>7s

那麼這些巨集有什麼具體的意義呢,這就要看

/include/linux/init.h

檔案:

#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

在靜態編譯時就相當於

device_initcall

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

gianfar_device

使用的是

arch_initcall

,而gianfar_driver

使用的是

module_init

,因為arch_initcall

的優先順序大於

module_init

,所以gianfar

裝置驅動的

device

先於driver

在匯流排上新增。

linux裝置驅動載入的Makefile學習

因工作需要,現需要學習linux裝置驅動,從最簡單的字元裝置驅動開始,把自己的學習點滴記錄下來,堅持自己 去思考和總結。我為第乙個hello world字元驅動程式寫的makefile如下所示 kvers shell uname r ifneq kernelrelease obj m hello w...

Linux裝置驅動學習一 裝置和驅動的註冊

使用itop 4412開發板,用的是scp 1g的板子。首先是對外部裝置的操作的三部曲 1.通過原理圖找到裝置連線的pin腳 處理器的資料手冊 3.編寫程式實現裝置的操作 1.裝置和驅動的註冊流程 一般都是先註冊裝置,再註冊驅動。現在引入的熱插拔裝置是先註冊的驅動。1 註冊裝置使用結構體platfo...

USB裝置驅動載入過程

本文摘自 使用者插入usb裝置 usb匯流排 或者是pci匯流排,這個不太清楚,反正就是匯流排來著 識別到插入了usb裝置。匯流排和usb裝置進行通訊,獲取usb的硬體id 產品id,以及bcdversion。根據這些資訊組成裝置硬體id號 vid x pid x rev x。匯流排根據usb裝置的...