我在Linux字符設(shè)備驅(qū)動(dòng)框架一文中已經(jīng)簡單的介紹了字符設(shè)備驅(qū)動(dòng)的基本的編程框架,這里我們來探討一下Linux內(nèi)核(以4.8.5內(nèi)核為例)是怎么管理字符設(shè)備的,即當(dāng)我們獲得了設(shè)備號(hào),分配了cdev結(jié)構(gòu),注冊(cè)了驅(qū)動(dòng)的操作方法集,最后進(jìn)行cdev_add()的時(shí)候,究竟是將哪些內(nèi)容告訴了內(nèi)核,內(nèi)核又是怎么管理我的cdev結(jié)構(gòu)的,這就是本文要討論的內(nèi)容。我們知道,Linux內(nèi)核對(duì)設(shè)備的管理是基于kobject的(參見Linux設(shè)備管理(一)_kobject_kset_kobj_type),這點(diǎn)從我們的cdev結(jié)構(gòu)中就可以看出,所以,接下來,你將看到"fs/char_dev.c"中實(shí)現(xiàn)的操作字符設(shè)備的函數(shù)都是基于"lib/kobject.c"以及"drivers/base/map.c"中對(duì)kobject操作的函數(shù)。好,現(xiàn)在我們從cdev_add()開始一層層的扒。

cdev_map對(duì)象

//fs/char_dev.c
 27 static struct kobj_map *cdev_map;

內(nèi)核中關(guān)于字符設(shè)備的操作函數(shù)的實(shí)現(xiàn)放在"fs/char_dev.c"中,打開這個(gè)文件,首先注意到就是這個(gè)在內(nèi)核中不常見的靜態(tài)全局變量cdev_map(27),我們知道,為了提高軟件的內(nèi)聚性,Linux內(nèi)核在設(shè)計(jì)的時(shí)候盡量避免使用全局變量作為函數(shù)間數(shù)據(jù)傳遞的方式,而建議多使用形參列表,而這個(gè)結(jié)構(gòu)體變量在這個(gè)文件中到處被使用,所以它應(yīng)該是描述了系統(tǒng)中所有字符設(shè)備的某種信息,帶著這樣的想法,我們可以在"drivers/base/map.c"中找到

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式