作者: kiki
參考資料:<linux設備驅動開發詳解-宋寶華>
轉載請註明出處!
day00
摘要: linux字符設備驅動cdev結構體
1.cdev結構體:描述一個字符設備
代碼定義:
struct{
struct kobject kobj; /*內嵌的kobject對象*/
struct module *owner; /*所屬模塊*/
struct file_operations *ops; /*文件操作結構體*/
struct list_head list;
dev_t dev; /*設備號*/
unsigned int count;
};
(1)dev_t定義設備號,32位,12位主設備號,20位次設備號.
(2)使用宏MAJOR,MINOR可以獲得設備主次號:
MAJOR(dev_t dev) /*主設備號*/
MINOR(dev_t dev) /*次設備號*/
(3)宏MKDEV可以通過主設備號和次設備號生成dev_t
MKDEV(int major,int minor)
(4)成員函數file_operations定義了字符設備驅動提供給虛擬文件系統的接口函數.
(5)linux內核提供了一組函數用於操作cdev結構體:
void cdev_init(struct cdev *,struct file_operations *);
/*初始化cdev成員,並建立cdev和file_operations之間的連接.*/
struct cdev *cdev_alloc(void);
/*動態申請一個cdev內存*/
void cdev_put(struct cdev *p);
int cdev_add(struct cdev *,dev_t,unsigned);
/*完成字符設備註冊(添加一個cdev),調用發生在字符設備驅動模塊加載函數中*/
void cdev_del(struct cdev *);
/*刪除一個cdev,調用發生在模塊卸載函數中*/
在向系統註冊字符設備之前,應先調用
register_chrdev_region()/*用於已知起始設備號*/
或
alloc_chrdev_region()/*用於設備號未知*/
函數向系統申請設備號.後者的優點在於能自動避開設備號重複的衝突.
同理,註銷字符設備後,要釋放申請的設備號,調用
unregister_chrdev_region()