我在Linux字符設(shè)備驅(qū)動框架一文中已經(jīng)簡單的介紹了字符設(shè)備驅(qū)動的基本的編程框架,這里我們來探討一下Linux內(nèi)核(以4.8.5內(nèi)核為例)是怎么管理字符設(shè)備的,即當(dāng)我們獲得了設(shè)備號,分配了cdev結(jié)構(gòu),注冊了驅(qū)動的操作方法集,最后進(jìn)行cdev_add()的時候,究竟是將哪些內(nèi)容告訴了內(nèi)核,內(nèi)核又是怎么管理我的cdev結(jié)構(gòu)的,這就是本文要討論的內(nèi)容。我們知道,Linux內(nèi)核對設(shè)備的管理是基于kobject的(參見Linux設(shè)備管理(一)_kobject_kset_kobj_type),這點從我們的cdev結(jié)構(gòu)中就可以看出,所以,接下來,你將看到"fs/char_dev.c"中實現(xiàn)的操作字符設(shè)備的函數(shù)都是基于"lib/kobject.c"以及"drivers/base/map.c"中對kobject操作的函數(shù)。好,現(xiàn)在我們從cdev_add()開始一層層的扒。
cdev_map對象
//fs/char_dev.c 27 static struct kobj_map *cdev_map;
內(nèi)核中關(guān)于字符設(shè)備的操作函數(shù)的實現(xiàn)放在"fs/char_dev.c"中,打開這個文件,首先注意到就是這個在內(nèi)核中不常見的靜態(tài)全局變量cdev_map(27),我們知道,為了提高軟件的內(nèi)聚性,Linux內(nèi)核在設(shè)計的時候盡量避免使用全局變量作為函數(shù)間數(shù)據(jù)傳遞的方式,而建議多使用形參列表,而這個結(jié)構(gòu)體變量在這個文件中到處被使用,所以它應(yīng)該是描述了系統(tǒng)中所有字符設(shè)備的某種信息,帶著這樣的想法,我們可以在"drivers/base/map.c"中找到
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式