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裝置的...