Linux雜項設備與字符設備
.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雜項設備與字符設備