? ? ?大家好,今天給大家分享一下,linux系統中常見的注冊函數register_chrdev_region()、register_chrdev()、 alloc_chrdev_region()的使用方法。
一、函數包含的頭文件:
分配設備編號,注冊設備與注銷設備的函數均在fs.h中申明,如下:
extern int register_chrdev_region(dev_t, unsigned, const char *); //靜態的申請和注冊設備號?
extern int? alloc_chrdev_region(dev_t, unsigned, const char *);? ? ?//動態的申請注冊一個設備號
extern int register_chrdev(unsigned int, const char *,struct file_operations *);//int為0時候動態注冊,非零時候靜態注冊。
extern int unregister_chrdev(unsigned int, const char *);? ?//注銷設備號
extern void unregister_chrdev_region(dev_t, unsigned);? ?//注銷設備號
二、注冊設備號
靜態注冊:
使用register_chrdev_region()首先需要定義一個dev_t變量來作為一個設備號,
dev_t? ?dev_num;?
要想注冊一個設備則需要一個主設備號。
根據主設備號獲取設備號:
dev_num=MKDEV(major,minor);? major是一個表示設備號的主設備號,minor次設備號
注冊:
register_chrdev_region(dev_num,2,"dev_name");
第一個參數表示設備號,第二個參數表示注冊的此設備數目,第三個表示設備名稱。
動態注冊:
如果我們提前知道設備的編號,那么就用register_chrdev_region(),但是如果我們不知道呢,我們就使用動態申請設備編號。
alloc_chrdev_region(&dev_num, minor, 2, "dev_name");
第一個參數保存生成的設備號,第二個參數注冊設備的數目,第三個參數表示設備名稱。
根據設備號獲取主設備號:
dev_major = MAJOR(dev_num);?
三、向內核中添加設備
struct cdev? devno;
cdev_init(&devno,&file_ops); //初始化設備
devno.owner = THIS_MODULE;? ?//.owner這表示誰擁有你這個驅動程序,
devno.ops = &mem_fops;
對于已經知道了主設備號,就用cdev_add(&devno, dev_num,count);來添加設備
如果是動態申請的設備號,就用cdev_add(&devno, MKDEV(mem_major, 0), count);
向內核添加設備,第一個參數是設備,第二個參數是設備號,第三個參數是要注冊的次設備數目,mem_major在動態申請時候保存起來了。
四、注銷設備
注銷設備時候,使用unregister_chrdev_region(dev_t, unsigned);第一個參數設備號,和注冊時候的要一致,因此如果是動態分配的就需要保存起來,第二個參數是次設備的個數。
五、register_chrdev()函數的不一致
register_chrdev(unsigned int, const char *,struct file_operations *); // 申請注冊設備號以第一個參數來辨別動態與靜態。
1、如果第一個參數是0,表示動態的分配給此驅動程序一個主設備號,
2、非零時候,表示備驅動程序向系統申請主設備號,
第二個是設備名,第三個file_operations,如果是動態分配的,則函數返回分配的主設備號。
對應的使用unregister_chrdev(unsigned int, const char *);來注銷設備,第一個參數是主設備號,必須和注冊時候的主設備號一致,如果注冊時候是動態的分配的主設備號,就需要保存起來,第二個是設備名。
綜上得出:register_chrdev_region()比register_chrdev()多了一步,就是想內核注冊添加cdev設備的步驟。
register_chrdev_region()是register_chrdev()的升級版本。
審核編輯:湯梓紅
評論