驅動編程小記

宏:__KERNEL__, MODULE, __VERSION__
__KERNEL__:表明這將是用於內核的代碼,否則很多內核過程將無法使用。
MODULE:如果是以模塊方式編譯,需要定義這個宏;
__VERSION__:定義這個宏則需要驅動程序的內核版本要和內核版本一致。

module_init()/module_exit(): [spioc_init()/spioc_exit()]
每個驅動程序都要有這兩個函數,它們分別用於設備驅動程序的加載和撤消。

static struct file_operations spioc_fops:
每個驅動程序都要有這樣的結構體,可能不止一個。用register_chrdev()
註冊驅動程序時這個結構體的起始地址被傳送到內核的設備表中。

SPIOC_MAJOR:
每個設備驅動程序有一個主設備號(major number)。不同設備驅動程序不能
使用相同的主設備號。一個設備驅動程序可以管理不同的(但一般是同一類的)
設備,通過次設備號(minor number)區分。

spioc_ open()/close(),read()/write(), ioctl():
根據具體驅動程序定義和使用。一般open()/close()總是需要的,而且
open()和close()一定要成對出現。

設備驅動程序被靜態編譯到內核中的情況:
module_init()指示內核在啓動過程中運行設備的初始化函數,如spioc_init()函數。驅動程序的加載隨內核的啓動一起完成。
靜態編譯的內核模塊不能被動態卸載,只有到系統關閉時由內核執行相應的卸載函數,如spioc_exit()。
嵌入式操作系統一般使用靜態內核模塊以減少系統的尺寸和複雜性。

設備驅動程序被動態加載到內核中的情況:
首先,驅動程序需要被編譯成目標文件,如spioc.o,內核2.6之後爲spioco.ko。
在操作系統運行之後,使用insmod命令將驅動程序模塊動態加載到內核中
$ insmod spioc.o
使用insmod命令動態加載的內核模塊可以使用rmmod命令動態地從內核中卸載
$ rmmod spioc.o
使用內核的動態模塊加載/卸載功能需要內核支持kmod功能。
發佈了40 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章