Linux核心register_chdev回傳值

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

答案1

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當設備驅動程式處理呼叫時,或需要確定給定設備對應的次要設備(如果它處理多個主要設備,則可能是主要設備)的任何其他時間,就會發揮作用。驅動程式被賦予要求處理的索引節點;對於設備節點,包括設備編號,對主要和次要進行編碼。這MAJORMINOR宏,或從 inode 開始,imajoriminor函數,應該用來提取值。

一些字元設備在上述主要註冊機制之上提供多重化;看一個雜項驅動程式如何控制所有這些不同的硬體?舉個例子。

相關內容