驅動之cdev
時間:2016-12-12作者:華(hua)清遠見
前面寫到(dao)如(ru)何(he)向(xiang)系(xi)統申請一(yi)個(ge)(ge)設備號,設備號就像我們的身份證號一(yi)樣,號本身并沒有(you)什么特(te)殊(shu)的意義,只有(you)把這個(ge)(ge)號和人對(dui)應才有(you)意義,通用(yong)設備號也(ye)需要和一(yi)個(ge)(ge)特(te)殊(shu)的東西對(dui)于,這就是cdev, cdev是linux下(xia)(xia)抽象出(chu)來的一(yi)個(ge)(ge)用(yong)來描述一(yi)個(ge)(ge)字符設備的結構體,在linux下(xia)(xia)定(ding)義如(ru)下(xia)(xia): struct cdev { 結構體中有幾個成員事我們寫驅動的時(shi)候必須關心的: dev 類型(xing)是dev_t,也就是我們的設備號 ops是(shi)(shi)一(yi)個(ge)(ge)(ge)同(tong)樣也是(shi)(shi)一(yi)個(ge)(ge)(ge)結構體并且(qie)是(shi)(shi)一(yi)個(ge)(ge)(ge)字(zi)符驅(qu)動(dong)實現的(de)(de)(de)主體,字(zi)符驅(qu)動(dong)通常(chang)需(xu)要和應(ying)用(yong)程(cheng)序交互,在學linux系統編程(cheng)的(de)(de)(de)時候,都(dou)會講到linux 應(ying)用(yong)程(cheng)序通過系統調用(yong)陷入到內(nei)核(he)空間,從(cong)而執(zhi)(zhi)行(xing)內(nei)核(he)代碼,而驅(qu)動(dong)作為內(nei)核(he)的(de)(de)(de)一(yi)部分同(tong)樣也是(shi)(shi)需(xu)要在內(nei)核(he)空間執(zhi)(zhi)行(xing)的(de)(de)(de),ops也就是(shi)(shi)file_operations這個(ge)(ge)(ge)結構體就是(shi)(shi)我(wo)們的(de)(de)(de)驅(qu)動(dong)為應(ying)用(yong)程(cheng)序調用(yong)驅(qu)動(dong)而實現的(de)(de)(de)一(yi)個(ge)(ge)(ge)操作的(de)(de)(de)集(ji)合,它(ta)的(de)(de)(de)定(ding)義如下: struct file_operations { 我(wo)們在驅動中要做的(de)事(shi)情就是申請一個(ge)cdev并把(ba)cdev注冊到系統(tong)中去,操作cdev的(de)函數有: void cdev_init(struct cdev *, const struct file_operations *); 1、cdev的定(ding)義 cdev的定義(yi)有兩種(zhong)方式一(yi)種(zhong)是:struct cdev cdev;另外(wai)一(yi)種(zhong)是:strcut cdev cdev;cdev = cdev_alloc(); 2、cdev的初始化 cdev_init實現(xian)cdev的(de)(de)初(chu)始化,主要的(de)(de)工作是將我們定義好的(de)(de)file_operaionts與(yu)cdev關聯起來(lai),file_operations的(de)(de)實現(xian)根據實際需求來(lai)實現(xian),后面詳細介紹。 3、cdev的注冊 cdev_add實現(xian)cdev的(de)(de)注(zhu)冊(ce),linux內核里維(wei)護了一個cdev_map的(de)(de)表,所謂(wei)cdev的(de)(de)注(zhu)冊(ce)就是把(ba)我們的(de)(de)cdev注(zhu)冊(ce)到cdev_map表上,cdev_map表結構如圖:
4、設(she)備的刪除 cdev_del 將(jiang)我們的(de)cdev從cdev_map中移除(chu)。
發表評論
|