設備驅動基礎
設備驅動的使用方式:
- 動態加載
- 直接編譯進內核
直接編譯進內核的方法:(內核源碼/Doucument/kbuild/…中有相應的介紹)
.config:頂層配置文件,可以手動修改,也可以通過make menuconfig等命令配置內核自動生成;該文件對驅動進行三個方面配置:
- 編譯成驅動模塊
- 編譯進內核
- 從內核中除去
Kconfig:連接LINUX內核的模塊目錄文件;功能:
- 用於定義make menuconfig命令顯示的菜單
- 導入位於其他目錄的Kconfig文件,make命令通過Kconfig文件的遞歸引用,找到內核代碼中所有Kconfig文件,之後創建菜單欄
Makefile:一般與Kconfig文件配對,該文件用來指定如何編譯
舉例說明:
Konfig 文件:
config LED_DRIVER //用於在.config中生成CONFIG_LED_DRIVER=y/n;
//用來將驅 動編譯進內核與否
bool “led driver” // 菜單中顯示的選項名
help //幫助提示
3.驅動程序分類:
- 字符型設備
- 塊設備
- 網絡接口
- 其他:如SCSI
4.字符設備:
- 指的存取時沒有緩存的設備
- 可以像文件一樣訪問字符設備,字符設備驅動程序負責實現這些行爲
5.塊設備:
- 塊設備是文件系統的宿主,如磁盤。
- 大多數Unix系統中,只能將塊設備看做多個塊設備進行訪問
- 塊設備經常是1KB數據,LINUX允許像字符設備那樣讀取塊設備–允許一次傳輸任意數目的字節
6.網絡接口設備
- 任何網絡事務都是通過接口實現的
- 接口是一個硬件設備,也可以是loopback接口一樣是軟件工具
- 網路接口由內核網絡子系統驅動
7.相關命令
insmod lsmod rmmod depmod
注:
depmod:生成依賴文件,告訴將來的insmod要從何處調入modules。
這個依賴文件是/lib/modules/$(version)/modules.dep
最簡單的設備驅動框架
#include<linux/init.h>
#include<linux/kernel.h> /*提供printk()打印函數*/
#include<linux/module.h>
static int xxx_init()
{
return 0;
}
static void xxx_Exit(void)
{
}
module_init(xxx_init); /*insmod 入口*/
module_exit(xxx_Exit); /*rmmod 入口*/