Linux字符設備驅動-cdev結構體day00

作者: 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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章