1. 程式人生 > >Linux雜項設備與字符設備

Linux雜項設備與字符設備

架設 設計 () ont 分配 nbsp 順序 輸入 per

.1 雜項設備驅動的引入

字符設備指那些必須以串行順序依次進行訪問,且沒有經過系統快速緩沖的設備,了解了Linux內核中驅動的框架和組成,以及編寫的步驟等。但是,當我們寫的驅動程序多了之後,就會發現:部分硬件並不符合預先定義的字符設備的範疇,而且普通字符設備的主設備號不管是靜態分配還是動態分配,都會消耗一個主設備號(目前一個系統最多只能有255個字符設備),比較浪費主設備號資源。因此,而引入了雜項設備驅動。

雜項設備是一個典型的字符設備(與接下來要介紹的輸入子系統一樣,呵呵),其主設備號固定為10。其內部實現就是用主設備號10來調用register_chrdev()實現的;並且在內部還調用了class_create()和device_create ()為每個雜項設備創建設備節點,從而避免了我們通過mknod命令或自行調用該兩個函數來創建設備節點的麻煩。

從以上這點來說,雜項設備就是將我們平常編寫字符設備的驅動進行了再次封裝,降低了我們編寫字符設備驅動的難度,同時節約了主設備號資源。

.3 雜項設備與字符設備實現比較

在進行字符設備驅動程序開發的過程中,我們的實現步驟如下:

申請一個字符設備號:可以自己指定,也可系統自動分配;

構造一個file_operations結構體,其包含對硬件的所有操作;

實現file_operations結構體中的成員函數;

將字符設備註冊進系統中:register_chrdev();

創建設備類和設備節點:class_create()、device_create();

告訴內核入口與出口函數:module_init()、module_exit();

雜項設備驅動也是字符設備驅動,那麽其註冊的過程與字符設備驅動一樣,也必須經過上面的這些步驟,只是雜項設備驅動中的對申請字符設備號、註冊字符設備到系統、創建設備類和設備節點進行了封裝,我們只需要完成如下幾步開發即可:

構造一個file_operations結構體,其中包含對硬件的所有操作;

實現file_operations結構體中的成員函數;

構造一個雜項設備驅動(struct miscdevice)實體,並賦值前面定義的file_operations實體;

在入口函數處調用misc_register()向系統註冊雜項設備;

在出口函數處調用misc_deregister()從系統註銷雜項設備;

告訴內核入口與出口函數:module_init()、module_exit();

從中也可以得出一個結論:無論Linux內核對驅動框架設計的如何好,內核實現了多少的代碼,與硬件相關部分的代碼還是需要我們去實現。

Linux雜項設備與字符設備