一個解決方案是讓驅動程序動態創建/dev
中的文件,而不是使用mknod
命令創建它們。基本思想是通過調用class_create
從模塊初始化函數創建一個自定義設備類,然後通過調用device_create
將設備添加到該類。
您需要一個類型爲struct class *
的變量來存放指向自定義類的指針。這個變量需要通過你的模塊中的各種功能的訪問,因此需要外的任何功能進行申報,並通常會宣佈static
像這樣:
static struct class *foo_class;
你的模塊初始化函數需要創建類和檢查錯誤:
foo_class = class_create(THIS_MODULE, "foo");
if (IS_ERR(foo_class)) {
/* Failed to create class. */
rc = PTR_ERR(foo_class);
goto fail_class_create;
}
(在這裏,goto fail_class_create
跳轉到一個標籤來清理東西返回錯誤前,迄今所做的如果你不喜歡這種「錯誤GOTO」模式,可隨時清理這裏明確。之前返回錯誤。)
如果class_create
功能是成功的,當不再需要在你的模塊退出函數應該摧毀它,也可作爲清理,如果有錯誤,在你的模塊初始化函數進一步下跌的一部分:
class_destroy(foo_class);
雖然創建類時,可以通過調用device_create
來創建設備,並且device_destroy
來銷燬屬於該類的設備(我稱之爲「類設備」)來創建(並銷燬)設備。這兩種功能都使用設備節點號(主要和次要設備號的組合)來指定要創建或銷燬的類設備。例如一個類設備可以如下創建:
struct device *csdev;
/* ... */
csdev = device_create(foo_class, hwdev, MKDEV(foo_major, minor), privdata, "foo%u", minor);
if (IS_ERR(csdev)) {
/* Failed to create device. */
rc = PTR_ERR(csdev);
/* Do any clean-up here. */
}
(這裏,foo_class
指向先前創建的自定義類; hwdev
點到下面的「硬件設備」,或者可以,如果有設置爲NULL
沒有基礎硬件設備; foo_major
是您的主要設備號(由register_chrdev
分配,minor
是您要創建的設備的次要設備號,privdata
是私有數據指針,通常指向您的設備的一些私有數據結構,但它可以爲NULL
;其餘參數由printf樣式的格式字符串和格式字符串需要的任何額外參數組成重新設置設備名稱。)
在上例中,如果minor
爲0,則設備將被動態創建爲/dev/foo0
。
破壞裝置,呼叫device_destroy
如下:(這裏,foo_class
,foo_major
和minor
是作爲傳遞給device_create
相同)
device_destroy(foo_class, MKDEV(foo_major, minor));
上述功能導出爲GPL只,所以如果你想使用它們,你的模塊將需要使用以下聲明聲明其許可證:
MODULE_LICENSE("GPL");
'/ dev'是一個動態創建的文件系統。它不是一個真正的磁盤上的東西,因此每次啓動系統時都會重新創建它。除非您的應用程序成爲啓動鏈的一部分,並且每次都重新創建其設備,否則您的文件將消失。 –
那麼我該如何克服這個問題。 –
http://www.linuxquestions.org/questions/linux-newbie-8/create-a-device-file-using-udev-738448/ – stark