Linux-Kernel

Linux 核心 register_chdev 返回值

  • October 29, 2021

該影片展示了一個範例 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;對於一個設備節點,它包括設備號,它對主要和次要進行編碼。MAJORandMINOR宏,或從 inode 開始,andimajor函式iminor,應該用於提取值。

一些字元設備在上述主要註冊機制之上提供多路復用;請參閱一個 misc 驅動程序如何控制所有這些不同的硬體?舉個例子。

引用自:https://unix.stackexchange.com/questions/675281