Linux驅(qū)動(dòng)之cdev結(jié)構(gòu)和MKDEV宏

MKDEV宏 功能:將主設(shè)備號(hào)和次設(shè)備號(hào)轉(zhuǎn)換成dev_t類型
cdev結(jié)構(gòu)
在Linux2.6
內(nèi)核中一個(gè)字符設(shè)備用cdev結(jié)構(gòu)來描述,其定義如下:
可以使用如下宏調(diào)用來獲得主、次設(shè)備號(hào):
MAJOR(dev_t dev)?
MINOR(dev_t dev)?
MKDEV(int major,int minor) //通過主次設(shè)備號(hào)來生成dev_t
以上宏調(diào)用在內(nèi)核源碼中如此定義:
參數(shù)介紹:
ma 為主設(shè)備號(hào)
mi 為次設(shè)備號(hào)
返回值:成功執(zhí)行返回dev_t類型的設(shè)備編號(hào)
我的理解是ma是主設(shè)備號(hào),mi是次設(shè)備號(hào)
主設(shè)備號(hào)由dev_t的高位表示
次設(shè)備號(hào)是dev_t的低位
我感覺MKDEV應(yīng)該是把主設(shè)備號(hào)和次設(shè)備號(hào)合成dev_t
下面一組函數(shù)用來對(duì)cdev結(jié)構(gòu)體進(jìn)行操作:
在注冊(cè)時(shí)應(yīng)該先調(diào)用:int register_chrdev_region(dev_t from,unsigned count,const char *name)
函數(shù)為其分配設(shè)備號(hào),此函數(shù)可用:int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count,const char *name)
函數(shù)代替,他們之間的區(qū)別在于:register_chrdev_region()
用于已知設(shè)備號(hào)時(shí),另一個(gè)用于動(dòng)態(tài)申請(qǐng),其優(yōu)點(diǎn)在于不會(huì)造成設(shè)備號(hào)重復(fù)的沖突。
在注銷之后,應(yīng)調(diào)用:void unregister_chrdev_region(dev_t from,unsigned count)
函數(shù)釋放原先申請(qǐng)的設(shè)備號(hào)。
他們之間的順序關(guān)系如下:
register_chrdev_region()
?-->?cdev_add()
?//此過程在加載模塊中
cdev_del()
?-->?unregister_chrdev_region()
?//此過程在卸載模塊中
后記: 這一套2.X內(nèi)核的驅(qū)動(dòng)相關(guān)技術(shù),現(xiàn)在好像是過時(shí)了,以茲紀(jì)念。