驅動是軟體和硬體溝通的橋梁,驅動大緻可以分為:字元裝置驅動(鍵盤、滑鼠、序列槽等資料不可以随機通路,多不帶緩沖區),塊裝置驅動(硬碟、flash等大容量資料儲存設備,資料可随機通路,大都帶有緩沖區),網絡接口驅動以及特定類型驅動等。
驅動的兩大任務:
1.最為系統調用的一部分而執行,運作在程序上下文。
2.負責進行中斷,運作在中斷上下文。
驅動是核心的一部分,驅動可以編譯進核心,也可以以子產品的形式隻在用到的時候加載進核心,這樣可以使核心盡量變得小,一般多采用子產品加載的模式。
驅動的漏洞和缺陷将直接危害核心的安全。(應留心未初始的指針和惡意使用者程式、緩沖區溢出等)
在編譯時候應注意核心版本号
當裝置驅動需要同時支援不同版本核心時,在編譯階段,核心子產品需要知道目前使用的核心源碼的版本,進而使用相應的核心 API。
可以用uname -r指令檢視版本号
版本号儲存在/usr/include/linux/version.h中
其實宏定義#define LINUX_VERSION_CODE 132643裡(我的核心是2.6.35)
132643是十進制表示,轉化成16進制是0x020623(是2.6.35)
http://lxr.oss.org.cn/source/include/linux/version.h?v=2.4.22#L11
這裡順帶推薦一下linux kernel cross reference這個網站,不解釋,你懂得!
從2.4到2.6,外部可裝載核心子產品的編譯、連接配接過程以及Makefile的書寫都發生了改變。
2.4核心中,子產品的編譯隻需核心源碼頭檔案;需要在包含linux/modules.h之前定義MODULE;編譯、連接配接後生成的核心子產品字尾為.o。
2.6核心中,子產品的編譯需要配置過的核心源碼;編譯、連接配接後生成的核心子產品字尾為.ko;編譯過程首先會到核心源碼目錄下,讀取頂層的Makefile檔案,然後再傳回子產品源碼所在目錄。
3.linux核心子產品的基本程式結構
#include<linux/kernel.h>
#incude<linux/module.h>
(必須有)子產品許可聲明:MODULE_LICENSE("GPL");
函數實作部分
(必須有)子產品加載:module_init(函數名);
(必須有)子產品解除安裝:module_exit(函數名);
子產品參數、導出符号、和作者資訊等可選