2016-09-12 30 views
0

我剛開始探索Linux字符設備驅動程序。我做了一個簡單的內核模塊,在這個模塊中我使用register_chrdev()函數註冊了設備。我已將0作爲參數傳遞給函數,並且內核返回可用的空閒主要編號。 之後,我使用mknod命令創建一個帶有返回主號碼的字符設備文件,並且我成功地做到了這一點。 我已經將驅動程序加載到內核中,驅動程序,設備文件和用戶空間應用程序之間的通信很好。在linux中重啓後字符設備文件不存在

問題是,當我重新啓動我的系統時,字符設備文件(使用mknod創建)不存在於/ dev目錄中。

所以請建議解決這個問題,這樣我的字符設備文件即使在重新啓動後也會出現在/ dev目錄中。

+2

'/ dev'是一個動態創建的文件系統。它不是一個真正的磁盤上的東西,因此每次啓動系統時都會重新創建它。除非您的應用程序成爲啓動鏈的一部分,並且每次都重新創建其設備,否則您的文件將消失。 –

+0

那麼我該如何克服這個問題。 –

+0

http://www.linuxquestions.org/questions/linux-newbie-8/create-a-device-file-using-udev-738448/ – stark

回答

0

一個解決方案是讓驅動程序動態創建/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_classfoo_majorminor是作爲傳遞給device_create相同)

device_destroy(foo_class, MKDEV(foo_major, minor)); 

上述功能導出爲GPL只,所以如果你想使用它們,你的模塊將需要使用以下聲明聲明其許可證:

MODULE_LICENSE("GPL"); 
相關問題