Linux驅動程序開發 003- 設備與驅動的關係

序言
前面兩章我們瞭解了Linux驅動程序的基本框架,也瞭解瞭如何編譯Linux的驅動程序。接下來我們有必要介紹Linux系統的設備了,這樣我們才能清楚的知道應用程序和設備驅動程序是如何的工作的,或者說應用程序是如何控制驅動程序的,進而知道應用程序是如何通過驅動程序操作設備的。

Linux設備分類
Linux下的設備通常分爲三類,字符設備,塊設備和網絡設備。
  • 字符設備
一個字符設備是一種字節流設備,對設備的存取只能按順序按字節的存取而不能隨機訪問,字符設備沒有請求緩衝區,所有的訪問請求都是按順序執行的。Linux下的大多設備都是字符設備。應用程序是通過字符設備節點來訪問字符設備的。設備節點一般都由mknod命令都創建在/dev目錄下,下面的例子顯示了串口設備的設備節點。字符設備文件的第一個標誌是前面的“c”標誌。
root#ls -l /dev/ttyS[0-3]
crw-rw----  1 root  root 4, 64 Feb 18 23:34 /dev/ttyS0
crw-r-----  1 root  root 4, 65 Nov 17 10:26 /dev/ttyS1
crw-rw----  1 root  root 4, 66 Jul  5  2000 /dev/ttyS2
crw-rw----  1 root  root 4, 67 Jul  5  2000 /dev/ttyS3
  • 塊設備
存儲設備一般屬於塊設備,塊設備有請求緩衝區,並且支持隨機訪問而不必按照順序去存取數據,比如你可以先存取後面的數據,然後在存取前面的數據,這對字符設備來說是不可能的。Linux下的磁盤設備都是塊設備,儘管在Linux下有塊設備節點,但應用程序一般是通過文件系統及其高速緩存來訪問塊設備的,而不是直接通過設備節點來讀寫塊設備上的數據。
root# ls -l /dev/hda[1-3]
brw-rw----  1 root  root  3, 1 Jul  5  2000 /dev/hda1
brw-rw----  1 root  root  3, 2 Jul  5  2000 /dev/hda2
brw-rw----  1 root  root  3, 3 Jul  5  2000 /dev/hda3
  • 網絡設備
網絡設備不同於字符設備和塊設備,它是面向報文的而不是面向流的,它不支持隨機訪問,也沒有請求緩衝區。在Linux裏一個網絡設備也可以叫做一個網絡接口,如eth0,應用程序是通過Socket而不是設備節點來訪問網絡設備,在系統里根本就不存在網絡設備節點。

相對於這三類設備,Linux設備驅動程序也分爲對應的三類:字符設備驅動程序、塊設備驅動程序和網絡設備驅動程序。

設備節點、設備驅動及設備的關聯
當我們訪問一個設備節點是,系統是如果知到使用哪個設備驅動及訪問哪個設備的呢?這個是通過設備號來實現的。當我們創建一個設備節點時需要指定主設備號和次設備號。對於設備節點來說,名字不是重要的,設備號纔是最重要的,它實際指定了對應的驅動程序和對應的設備。
  • 主設備號
驅動程序在初始化時,會註冊它的驅動及對應主設備號到系統中,這樣當應用程序訪問設備節點時,系統就知道它所訪問的驅動程序了。你可以通過/proc/devices文件來驅動系統設備的主設備號。
  • 次設備號
驅動程序遍歷設備時,每發現一個它能驅動的設備,就創建一個設備對象,併爲其分配一個次設備號以區分不同的設備。這樣當應用程序訪問設備節點時驅動程序就可以根據次設備號知道它說訪問的設備了。

Linux中設備節點是通過“mknod”命令來創建的。一個設備節點其實就是一個文件,Linux中稱爲設備文件。有一點必要說明的是,在Linux中,所有的設備訪問都是通過文件的方式,一般的數據文件程序普通文件,設備節點稱爲設備文件。在Linux內核中網絡設備也是通過文件操作的,稱爲網絡設備文件,在用戶空間是通過socket接口來訪問的。socket號就是網絡設備文件描述符。

後記
這一章我們瞭解了Linux設備、設備節點與設備驅動的關係,也瞭解了應用程序是如何通過設備驅動程序訪問設備的。下一章我們就可以給Hello World程序添加讀寫功能了,並且爲它創建一個設備節點,這樣我們就可以通過應用程序來操作Hello World驅動程序的內容了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章