簡體   English   中英

關於linux設備驅動程序中的register_chrdev_region()的問題

[英]Questions about register_chrdev_region() in linux device driver

我正在學習使用register_chrdev_region(dev_t from, unsigned count, const char * name);內核模塊register_chrdev_region(dev_t from, unsigned count, const char * name);

我注意到有或沒有這個函數,我的內核模塊按預期工作。 我用來測試的代碼:

first = MKDEV(MAJOR_NUM, MINOR_NUM);
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without

mycdev=cdev_alloc();
mycdev->ops= &fops;
mycdev->owner = THIS_MODULE;

if (cdev_add(mycdev,first, count) == 0)
{printk(KERN_ALERT "driver loaded\n");}

我注釋掉了register_chrdev_region(first, count, DEVICE_NAME);register_chrdev_region(first, count, DEVICE_NAME); printk消息仍然出現。 我試圖在有或沒有用戶空間的情況下與驅動程序通信,並且兩者都是成功的。

所以我的問題是,這個函數register_chrdev_region()僅用於使我的驅動程序成為一個好的內核公民,就像告訴其他人“我用完主要數字,請不要使用”?

我試着看一下內核源代碼char_dev.c來理解這個函數,但是我發現它太難理解了,有誰熟悉這個?

謝謝!

這樣可行,因為實際上並不需要預先分配您的設備號。 實際上,許多內核開發人員認為使用動態(動態,按需)分配函數alloc_chrdev_region

無論你做靜態前面或根據需要動態地,這你應該做的,以避免與可能的規則發揮和被分配你想使用的號碼其他設備驅動程序沖突。 即使您的駕駛員在沒有它的情況下完美運行,但在每台機器上或將來的任何時間都不一定如此。

這些規則是有原因的,特別是對於低級別的東西,建議您遵循這些規則。

有關設置過程的詳細信息,請參見此處

如果設備的主設備號碼與已使用的任何其他設備發生沖突,則驅動程序將無法完成分配。

如果您已經測試了哪個主要編號是免費的並且使用它,它通常不會引發錯誤,並且您在加載驅動程序時不會遇到任何問題。

但是,如果您在各種系統上運行,並且主要數字已經被其他系統捕獲並使用。那么您的驅動程序加載可能會失敗。

它總是更好地使用動態分配!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM