Unix操作系統(tǒng)之設備驅(qū)動程序
由于經(jīng)常學習Unix操作系統(tǒng)的一些知識,而且很喜歡Unix操作系統(tǒng),在工作中也很喜歡總結關于Unix操作系統(tǒng)相關的經(jīng)驗教訓,下面就Unix操作系統(tǒng)下的設備驅(qū)動程序問題來詳細說說吧。
Unix操作系統(tǒng)下的設備驅(qū)動程序
具體到系統(tǒng)里,設備驅(qū)動程序所提供的這組入口點由一個結構來向系統(tǒng)進行說明,其中,struct inode提供了關于特別設備文件/dev/driver(假設此設備名為driver)的信息,它的定義為:
dev_t i_rdev& /* Device major and minor numbers*/
struct vm_area_struct * i_mmap&
unsigned short i_flags& /* Mount flags see fs.h */
struct file主要用于與Unix操作系統(tǒng)文件系統(tǒng)對應的設備驅(qū)動程序使用。當然,其它設備驅(qū)動程序也可以使用它。它提供關于被打開的文件的信息,定義為:unsigned short f_flags& /* The flags arg passed to open */
在結構file_operations里,指出了設備驅(qū)動程序所提供的入口點位置,分別是:
1 lseek,移動文件指針的位置,顯然只能用于可以隨機存取的設備。
2 read,Unix操作系統(tǒng)進行讀操作,參數(shù)buf為存放讀取結果的緩沖區(qū),count為所要 讀取的數(shù)據(jù)長度。返回值為負表示讀取操作發(fā)生錯誤,否則返回實際讀取 的字節(jié)數(shù)。對于字符型,要求讀取的字節(jié)數(shù)和返回的實際讀取字節(jié)數(shù)都必須是inode- i_blksize的的倍數(shù)。
3 write,進行寫操作,與read類似。
4 readdir,取得下一個目錄入口點,只有與Unix操作系統(tǒng)文件系統(tǒng)相關的設備驅(qū)動程序 才使用。
5 selec,進行選擇操作,如果驅(qū)動程序沒有提供select入口,select操 作將會認為設備已經(jīng)準備好進行任何的I/O操作。
6 ioctl,進行讀、寫以外的其它操作,參數(shù)cmd為自定義的的命令。
7 mmap,用于把設備的內(nèi)容映射到地址空間,一般只有塊設備驅(qū)動程序使 用。
8 open,打開設備準備進行I/O操作。返回0表示打開成功,返回負數(shù)表示失敗。如果驅(qū)動程序沒有提供open入口,則只要/dev/driver文件存在就認為打開成功。
9 release,即close操作。 設備驅(qū)動程序所提供的入口點,在設備驅(qū)動程序初始化的時候向系統(tǒng)進行登 記,以便系統(tǒng)在適當?shù)臅r候調(diào)用。LINUX系統(tǒng)里,通過調(diào)用register_chrdev 向系統(tǒng)注冊字符型設備驅(qū)動程序。register_chrdev定義為:
int register_chrdevunsigned int major, const char *name,
其中,major是為設備驅(qū)動程序向Unix操作系統(tǒng)申請的主設備號,如果為0則Unix操作系統(tǒng)為此 驅(qū)動程序動態(tài)地分配一個主設備號。name是設備名。fops就是前面所說的對各個 調(diào)用的入口點的說明。此函數(shù)返回0表示成功。返回-EINVAL表示申請的主設備號 非法,一般來說是主設備號大于系統(tǒng)所允許的***設備號。返回-EBUSY表示所申 請的主設備號正在被其它設備驅(qū)動程序使用。
如果是動態(tài)分配主設備號成功,此 函數(shù)將返回所分配的主設備號。如果register_chrdev操作成功,設備名就會出 現(xiàn)在/proc/devices文件里。
初始化部分一般還負責給設備驅(qū)動程序申請系統(tǒng)資源,包括內(nèi)存、中斷、時 鐘、I/O端口等,這些資源也可以在open子程序或別的地方申請。在這些資源不 用的時候,應該釋放它們,以利于資源的共享。 在Unix操作系統(tǒng)里,對中斷的處理是屬于系統(tǒng)核心的部分,因此如果設備與系
統(tǒng)之間以中斷方式進行數(shù)據(jù)交換的話,就必須把該設備的驅(qū)動程序作為Unix操作系統(tǒng)核心的一部分。設備驅(qū)動程序通過調(diào)用request_irq函數(shù)來申請中斷,通過free_irq 來釋放中斷。
以上,我們就完成了對Unix操作系統(tǒng)下的設備驅(qū)動程序介紹。希望對大家對Unix操作系統(tǒng)的學習有所幫助。
【編輯推薦】