1. 程式人生 > 其它 >Linux驅動開發之裝置號

Linux驅動開發之裝置號

2021-07-06

關鍵字:主裝置號、次裝置號


1、什麼是裝置號

裝置號是Linux驅動開發中的術語。

Linux規定每一個字元裝置或塊裝置都必須擁有一個專屬裝置號。要想在Linux平臺開發驅動程式,申請裝置號就是開發過程的第一步,只有有了裝置號,才能向系統註冊裝置。

一個裝置號由以下兩個模組組成:

1、主裝置號;

2、次裝置號;

主裝置號用以表示一個驅動程式的種類。如:USB、顯示器、滑鼠等。

次裝置號用以表示此種類下具體的裝置。如:第n個USB介面、第n個顯示屏、第n個滑鼠等。

主裝置號是抽象的事物種類,次裝置號則是具象的實體裝置。

在 /proc/devices 檔案中記載著系統中所有已註冊的主裝置號及其註冊名稱。

裝置號佔32位的寬度。其中主裝置號佔高12位,次裝置號佔低20位。不過雖然主裝置號的寬度長達12位,實際上在Linux系統中有效值範圍僅為 1 ~ 255。

2、裝置號相關的介面

雖然我們知道主裝置號和次裝置號的具體位置,但是還是應該以系統提供的介面來拆分和組合主次裝置號。

在Linux核心中,裝置號被描述為 dev_t 型別,如下所示:

typedef u_long dev_t;

這個型別的定義隱藏的很深,不必去糾結它的實際定義標頭檔案。我們在開發驅動過程中只需要引入kdev_t.h標頭檔案就可以使用此型別的了:

./kernel/include/linux/kdev_t.h

同時,kdev_t.h標頭檔案中還定義了拆分和組合主次裝置號的巨集

,簡要概括如下:

MAJOR(dev_t) //從裝置號中將主裝置號拆分出來
MINOR(dev_t) //從裝置號中將次裝置號拆分出來

MKDEV(major, minor) //將主裝置號和次裝置號組合成裝置號

3、靜態註冊

第1節有提到過:必須持有裝置號才能向系統註冊裝置。而裝置號是一個整數,所以理論上我們可以隨意“捏造”一個裝置號用以向系統註冊我們的裝置。這種“捏造”裝置號以註冊裝置的形式就被稱為“靜態註冊”方式。

不過這裡有一個前提條件:儘量不要和已有的裝置號衝突,否則可能會導致裝置工作不正常。一般可以在核心原始碼的 documentation/devices.txt 中看到所有已被註冊使用的裝置號,我們按需選擇一個沒被佔用的即可。不過如果我們要新增的裝置的種類就是系統中已有的種類,那一般我們只需要註冊次裝置號不要衝突就可以了。

靜態註冊的方式需要注意的點太多,徒增開發難度。因此應儘量使用動態註冊的形式。

4、動態註冊

Linux有提供一個動態分配裝置號的介面,其原型如下所示:

int alloc_chrdev_region(dev_t* devid, unsigned int baseminor, unsigned int count, const char* name);

引數 devid 作為輸出引數使用。

引數 baseminor 表示次裝置號起始值。按需設定即可。

引數 count 表示要申請使用的次裝置號的數量。

引數 name 表示此裝置的描述名稱,即在 /proc/devices 中看到的名稱。

返回值0表示申請成功。

與動態註冊相對的是釋放介面。Linux中的裝置號是交由系統託管的。如果某驅動程式在執行過程中動態申請了某裝置號,但是在解除安裝時沒有釋放,則該裝置號仍舊存活於系統中。釋放裝置號的介面原型如下所示:

void unregister_chrdev_region(dev_t devid, unsigned int count);

引數 devid 表示裝置號。

引數 count 即次裝置號數量。


+++