閱讀944 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《LINUX設備驅動程序》學習劄記(二)

總結章節:第三節 字符設備驅動
這一章主要是講一些字符設備驅動程序的相關知識。在進行字符設備驅動程序學習之前,我們必須得弄明白一個問題:驅動程序時給誰用的。
很多驅動程序的初學者,按照一般編程語言(C,java等等)編寫應用程序的經驗,函數就是用來調用的。這種調用關係,在應用空間來看,限製不是很明顯。很多初學者都會誤認為,在驅動程序中寫的函數是為了以後應用程序來調用,比如:在驅動中程序中實現了switch()函數的功能,按照應用程序的觀念,在應用程序中應該可以調用switch()函數,從而來實現某種功能。這種錯誤的思維在從用戶空間應用程序程序員到驅動程序程序員的轉變過程中,經常會遇到這種問題。這其實是對驅動程序的本質屬性沒有弄透徹。驅動程序,就是內核的一部分,驅動程序的代碼是內核代碼的一部分。應用程序不能直接利用驅動程序來達到訪問硬件的目的,我們應該明白,應用程序是通過訪問/dev/下的設備文件,來間接的訪問硬件,驅動程序通過係統調用來實現將信息傳遞給/dev/下的設備文件。無論驅動程序中定義了什麼函數,應用空間都不能使用,哪怕是函數形態一樣,如果可以訪問的話,那就危險了。驅動程序中的函數永遠都是提供給係統內核使用的,由係統來自動調用,不需要應用程序幹預。
搞清楚上麵的問題之後,來看看字符設備驅動的一些重要的概念和數據結構。
1.    設備號
在linux 2.6內核中,用32位的dev_t類型的數據來表示,其中12位用來表示主設備號,其餘20位用來表示次設備號。主設備號是用來表示設備所對應的驅動程序的,也就是說,如果設備的主設備號相同,那麼這些設備的驅動程序是同一個。次設備號是給內核使用的,用來確定設備文件所指向的設備。盡管主設備號和次設備號的位數都固定了,但是,我們不應做出任何假設,如果我們需要從一個dev_t  dev(以後的使用中,設備號都是指dev_t類型的設備號)中得到主設備號和次設備號,應該使用下麵的宏:
                       MAJOR(dev_t dev);
                       MINOR(dev_t dev);
如果我們想用主設備號和此設備號來得到dev_t類型的設備號,應該使

2.    分配設備號
通常情況下,我們應該盡量使用動態分配設備號的方式。
       int  alloc_chrdev_region(dev_t  *dev,  unsigned int firstminor,  unsigned count,  char  *name);
這個函數將把申請範圍內身親到的第一個設備號傳給*dev.
當然,在已經知道設備號的前提下,使用
      int  register_chrdev_region(dev_t  first,  unsigned int count,  char  *name)
其中   first是申請設備號範圍內的其實設備號。first中的minor部分常常設為0.
但是,不論使用了哪種方式來分配設備號,我們都需要使用
     void  unregister_chrdev_region(dev_t  first, unsigner int count).
另外,由於動態分配設備號所分配的設備號不是確定的,那麼對於創建設備文件就比較麻煩了,但是我們可以使用腳本來自動創建,關於自動創建設備文件的腳本的理解詳見我的博客中的關於awk的解釋。

3.    重要的數據結構  file_operations    file    inode
 關於這些數據結構的內容,我就不多說了,隻想說明一些關鍵性的問題,file_operations數據結構定義了一些操作,一個設備文件隻有一個 inode,但是可以有多個file結構。file是在打開設備文件後由內核自動創建的。file結構用來表示一個打開的文件,而inode用來表示一個文件了。驅動程序的編寫實質性的工作就是對這些結數據結構進行填充,對相關數據結構中的函數進行實現
4.設備注冊
設備注冊的函數就不用講了。按照函數語法使用就可以了。

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/12/30/6108417.aspx
並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 04:01:46

  上一篇:go 關於定義一個指針與指針變量
  下一篇:go Linux背後的人