Linux 核心 register_chdev 返回值
該影片展示了一個範例 Raspberry Pi Linux 核心模組,它創建了一個新的字元設備。它使用核心 API
register_chdev
。在對影片的評論中(我無法生成指向它的直接連結),關於 的返回值register_chdev
,作者指出:如果返回值不等於 0,則設備號已在使用中。返回值的高 12 位是您的主設備號,低 20 位是次設備號。
我猜“設備號已經在使用”他的意思是“在核心模組中任意選擇的非零主要設備號已經在使用中”。
儘管有幾個網頁處理這個(官方的,然後是這個和這個),但我沒有找到任何關於返回值內部細分的資訊。
如果我選擇(使用我的核心模組)創建一個主設備號已在使用的設備,核心將永遠不會接受它並拒絕註冊該設備。當我選擇的主設備號與塊設備的主設備號相同時,以及我選擇的主設備號與字元設備的主設備號相同時,都會發生這種情況。
register_chdev
總是返回一個負值。相反,在後一種情況下,我期待一個正的非零返回值,高 12 位表示主要設備號,低 20 位表示次設備號(可能大於 0:如果主要設備號是已經使用過,也許系統已經至少有一個與之相關的設備,次要編號為 0)。Youtube評論中所說的是真的嗎?我在哪裡可以找到有關它的一些文件?
我正在執行 Raspbian 10,
uname -a
顯示:Linux raspberrypi 5.10.63-v7+ #1459 SMP Wed Oct 6 16:41:10 BST 2021 armv7l GNU/Linux
register_chrdev
它本身沒有在核心中記錄,但它的定義很短:static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops) { return __register_chrdev(major, 0, 256, name, fops); }
這基本上意味著它呼叫
__register_chrdev
註冊一個具有全方位未成年人(從 0 開始的 256 個未成年人)的專業,並返回該函式的結果。後者被記錄為如果*
major
*== 0,此函式將動態分配一個主要並返回其編號。如果*
major
*> 0,此函式將嘗試使用給定的主設備號保留設備,並在成功時返回零。失敗時返回 -ve errno。
沒有規定返回未成年人,編碼或其他方式。這些功能的目的是在任何情況下註冊一個專業,可能是未成年人的一個子集;沒有一個未成年人。
當設備驅動程序處理一個呼叫時,或者它需要確定給定設備對應的次要設備(如果它處理多個主要設備,可能還有主要設備)對應的任何其他時間,編碼就會發揮作用。
open
驅動程序獲得了它被要求處理的 inode;對於一個設備節點,它包括設備號,它對主要和次要進行編碼。MAJOR
andMINOR
宏,或從 inode 開始,andimajor
函式iminor
,應該用於提取值。一些字元設備在上述主要註冊機制之上提供多路復用;請參閱一個 misc 驅動程序如何控制所有這些不同的硬體?舉個例子。