驅動,就是讓硬件動起來,來爲咱們工做.linux
編寫驅動重點在於驅動提供的是機制而不是策略,咱們只須要提供驅動能幹什麼就行,至於怎麼用這些功能就是應用開發者的事情了.shell
並且驅動編寫的時候不能使用標準C庫,不能動態連接,只能是使用內核提供的庫.安全
由於驅動在內核空間工做,因此咱們要很是的當心,申請的資源應該及時的釋放,操做也要考慮併發,阻塞,搶佔,同步,異步等不穩定因素.網絡
驅動分爲字符設備驅動(以字節流的方式進行讀寫),塊設備驅動(以存儲塊的方式進行讀寫),網絡設備驅動(以數據報的方式進行讀寫).併發
編譯驅動的通常makefile形式(使用的源碼必須通過編譯,造成完整的內核樹):異步
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
#module-objs := file_name1.o ..... #多文件編譯
else
PWD := $(shell pwd)
#KDIR:= /root/kernel/linux-2.6.32.2 #自定義短語的內核源碼
KDIR := /lib/modules/`uname -r`/build #編譯電腦端的內核源碼
all:
make -C $(KDIR) M=$(PWD)
clean:
rm -rf *.o *.mod.c *.symvers *.c~ *~ *.order
endif函數
裝載驅動模塊
insmod,使用公有符號解析不存在的符號
modprobe:查找須要的依賴模塊,將依賴模塊一塊兒裝載
卸載驅動模塊
rmmod
-f強制卸載ui
printk:在內核空間中運行的輸出,和printf相似,就是添加了輸出優先級
KERN_EMERG"<0>"/*緊急事件消息,系統崩潰以前提示,表示系統不可用*/
KERN_ALERT"<1>"/*報告消息,表示必須當即採起措施*/
KERN_CRIT"<2>"/*臨界條件,一般涉及嚴重的硬件或軟件操做失敗*/
KERN_ERR"<3>"/*錯誤條件,驅動程序經常使用KERN_ERR來報告硬件的錯誤*/
KERN_WARNING"<4>"/*警告條件,對可能出現問題的狀況進行警告*/
KERN_NOTICE"<5>"/*正常但又重要的條件,用於提醒。經常使用於與安全相關的消息*/
KERN_INFO"<6>"/*提示信息,如驅動程序啓動時,打印硬件信息*/
KERN_DEBUG"<7>"/*調試級別的消息*/調試
dmesg查看全部的輸出,-c 查看並清除,-n 查看該優先級的輸出進程
current變量:<linux/sched.h>,顯示當前進程的一些信息
一個模塊須要導出到另外的模塊時,能夠添加:
EXPORT_SYMBOL(name);//導出到任意模塊
EXPORT_SYMBOL_GPL(name);//只能導出到GPL許可的模塊
MODULE_LICENSE("GPL");//許可憑證,若是沒有標記許可,內核就會以爲被"變髒"了
其餘的憑證還有
"GPL v2" gpl第二版本
"GPL and additional rights" gpl及附加權利
"Dual BSD/GPL" 雙重許可
"Dual MPL/GPL" 雙重許可
"Proprietary" 專有
MODULE_AUTHOR("代表模塊的做者");
MODULE_VERSION("代碼修訂號");
MODULE_ALIAS("別名");
MODULE_DEVICE_TABLE("所支持的設備");
MODULE_DESCRIPTION("描述模塊的做用");
模塊的通常初始化函數
static int __init function_name(void){
}
module_init(function_name);//調用該初始化函數
模塊的通常清除函數
static void __exit function_name(void){
}
module_exit(fuction_name);
模塊隨時會出錯,出錯之後必須將以前申請的資源所有釋放.可使用goto語句方便錯誤處理.
<linux/moduleparam.h>module_param(variable,type,perm);用來建立模塊參數的宏,用戶能夠在裝載時,調整這些參數參數:變量,數據類型,訪問控制訪問控制:S_IRUGO:可讀不可寫S_IRUGO | S_IWUSR 超級用戶能夠修改0:不會有對應的sysfs入口,不然參數模塊會在/sys/module中出現.若是在sys中被修改,也會一樣修改相應的值/sys/module:當前已裝載模塊的信息的目錄