1. 程式人生 > >Linux裝置節點、裝置和裝置驅動

Linux裝置節點、裝置和裝置驅動

Linux裝置分成三種基本型別:

  1. 字元裝置
  2. 塊裝置
  3. 網路裝置

裝置驅動程式也分為對應的三類:字元裝置驅動程式、塊裝置驅動程式和網路裝置驅動程式。

裝置節點被建立在/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

(dev_t *dev, unsigned int -firstminor, unsigned int -count, char *name)動態申請,dev是僅用於輸出的引數,儲存已分配範圍的第一個編號。動態分配的主裝置不能始終保持一致,需要在呼叫insmod後從讀取proc/devices檔案以獲取新分配的主裝置號,然後再/dev目錄中建立裝置節點。【注:驅動程式載入後,驅動名稱和對應的主裝置號會新增到proc/devices檔案中】

不管使用哪種方式分配裝置號,都應該在不再使用它們時呼叫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相應的刪除自動建立的裝置和類。