Linux裝置節點、裝置和裝置驅動
Linux裝置分成三種基本型別:
- 字元裝置
- 塊裝置
- 網路裝置
裝置驅動程式也分為對應的三類:字元裝置驅動程式、塊裝置驅動程式和網路裝置驅動程式。
裝置節點被建立在/dev
下,是連線核心與使用者層的樞紐,就是裝置是接到對應哪種介面的哪個
ID
上。 相當於硬碟的inode一樣的東西,立面記錄了硬體裝置的位置和資訊
在Linux中,所有裝置都以檔案的形式存放在/dev目錄下,都是通過檔案的方式進行訪問,裝置節點是Linux核心對裝置的抽象,一個裝置節點就是一個檔案。應用程式通過一組標準化的呼叫執行訪問裝置,這些呼叫獨立於任何特定的驅動程式。而驅動程式負責將這些標準呼叫對映到實際硬體的特有操作。
裝置節點,驅動,硬體裝置是如何關聯到一起的呢?
這是通過裝置號實現的,包括主裝置號和次裝置號。當我們建立一個裝置節點時需要指定主裝置號和次裝置號。應用程式通過名稱通過名稱訪問裝置,而裝置號指定了對應的驅動程式和對應的裝置。主裝置號標識裝置對應的驅動程式,次裝置號由核心使用,用於確定裝置節點所指裝置。
裝置號的分配
在建立裝置前,驅動首先要做的就是獲得一個或者多個裝置編號。一部分主裝置號已經靜態分配給了大部分常見裝置,在Documentation/devices.txt檔案中可以查到裝置清單。裝置號的分配有兩種方式:1)簡單選定一個未被使用的編號。呼叫intregister_chrdev_region(dev_t first, unsigned int count, char *name) 進行靜態註冊。這種方式選定的主裝置號一旦驅動程式被廣泛使用,可能造成衝突和麻煩。2)動態申請一個裝置號。呼叫intalloc_chrdev_region
不管使用哪種方式分配裝置號,都應該在不再使用它們時呼叫unregister_chrdev_region(dev_t first, unsigned int count)釋放這些裝置編號。
裝置號的使用
裝置號的使用應該始終使用<linux/kdev_t.h>中定義的巨集
- 獲取主次裝置號:MAJOR(dev_t dev) 和 MINOR(dev_t dev)
- 轉換成dev_型別:MKDEV(int major,int minor)
建立裝置節點
- 手動建立
使用mknode命令。命令格式為mknod name { b | c } Major Minor ,b表示塊裝置,c表示字元裝置。
- 自動建立
使用自動建立的前提是使用者空間移植了udev。在驅動的初始化程式碼裡呼叫class_create為該裝置建立一個class,再為每個裝置呼叫device_create建立對應的裝置。在移除模組時,要呼叫device_destroy 和class_destroy相應的刪除自動建立的裝置和類。