Linux驅動修煉之道 混雜裝置

2021-06-26 19:38:32 字數 2901 閱讀 7579

**

在linux驅動中把無法歸類的五花八門的裝置定義為混雜裝置(用miscdevice結構體表述)。

miscdevice共享乙個主裝置號misc_major(即10),但次裝置號不同。 所有的miscdevice設

備形成了乙個鍊錶,對裝置訪問時核心根據次裝置號查詢對應的miscdevice裝置,然後呼叫其file_operations結構中註冊的檔案操作介面進行操作。 在核心中用struct 

miscdevice表示miscdevice裝置,然後呼叫其file_operations結構中註冊的檔案操作介面進行操作。miscdevice的api實現在drivers/char/misc.c中。

下邊是描述這個裝置的結構體:

c-sharp** 

struct miscdevice  ;  

然後來看看misc子系統的初始化函式:

c-sharp** 

static

int __init misc_init(void)   

/*misc作為乙個子系統被註冊到linux核心中*/

subsys_initcall(misc_init);   

下邊是register_chrdev函式的實現:

c-sharp** 

int register_chrdev(unsigned int major, const

char *name,  

const

struct file_operations *fops)    

來看看這個裝置的操作函式的集合:

c-sharp** 

static

const

struct file_operations misc_fops = ;   

可以看到這裡只有乙個開啟函式,使用者開啟miscdevice裝置是通過主裝置號對應的開啟函式,在這個函式中找到次裝置號對應的相應的具體裝置的open函式。它的實現如下:

c-sharp** 

static

int misc_open(struct inode * inode, struct file * file)   

}   

if (!new_fops)    

}   

if (!new_fops)   

goto fail;   

}   

err = 0;   

/*儲存舊開啟函式的位址*/

old_fops = file->f_op;   

/*讓主裝置號的操作函式集合指標指向具體裝置的操作函式集合*/

file->f_op = new_fops;   

if (file->f_op->open)    

}   

fops_put(old_fops);   

fail:   

mutex_unlock(&misc_mtx);   

unlock_kernel();   

return err;   

}   

再來看看misc子系統對外提供的兩個重要的api,misc_register,misc_deregister:

c-sharp** 

int misc_register(struct miscdevice * misc)   

}   

/*看是否是需要動態分配次裝置號*/

if (misc->minor == misc_dynamic_minor)    

/*得到這個次裝置號*/

misc->minor = i;                                           

}   

/*設定點陣圖中相應位為1*/

if (misc->minor 

misc_minors[misc->minor >> 3] |= 1 

/*計算出裝置號*/

dev = mkdev(misc_major, misc->minor);   

/*在/dev下建立裝置節點,這就是有些驅動程式沒有顯式呼叫device_create,卻出現了裝置節點的原因*/

misc->this_device = device_create(misc_class, misc->parent, dev, null,   

"%s", misc->name);   

if (is_err(misc->this_device))    

/* * add it to the front, so that later devices can "override" 

* earlier defaults 

*//*將這個miscdevice新增到misc_list鍊錶中*/

list_add(&misc->list, &misc_list);   

out:   

mutex_unlock(&misc_mtx);   

return err;   

}   

這個是miscdevice的解除安裝函式:

c-sharp** 

int misc_deregister(struct miscdevice *misc)   

mutex_unlock(&misc_mtx);   

return 0;   

}   

總結一下miscdevice驅動的註冊和解除安裝流程:

misc_register:

匹配次裝置號->找到乙個沒有占用的次裝置號(如果需要動態分配的話)->計算設號->建立裝置文-

miscdevice結構體新增到misc_list鍊錶中。

misc_deregister:

從mist_list中刪除miscdevice->刪除裝置檔案->點陣圖位清零。

Linux驅動修煉之道 混雜裝置

在linux驅動中把無法歸類的五花八門的裝置定義為混雜裝置 用miscdevice結構體表述 miscdevice共享乙個主裝置號misc major 即10 但次裝置號不同。所有的miscdevice設 備形成了乙個鍊錶,對裝置訪問時核心根據次裝置號查詢對應的miscdevice裝置,然後呼叫其f...

linux混雜裝置驅動

在linux系統中,存在一類字元裝置,它們擁有相同的主裝置號 10 但次裝置號不同,我 們稱這類裝置為混雜裝置 miscdevice 所有的 混雜裝置形成乙個鍊錶,對裝置訪問時核心根據 次裝置號查詢到相應的混雜裝置。linux中使用struct miscdevice來描述乙個混雜裝置。struct ...

Linux驅動修煉之道

一些學習linux驅動的筆記整理在這裡與大家分享,如果那裡有錯誤也請高手指出。若干年後能進入intel開源中心或ibm搞linux kernel是我目前的目標。君子藏器於身,待時而動。文章 不斷更新中。linux驅動修煉之道 流水燈 linux驅動修煉之道 按鍵 linux驅動修煉之道 lcd背光與...