一文講解Linux 設(shè)備模型 kobject,kset
設(shè)備驅(qū)動(dòng)模型
面試的時(shí)候,有面試官會(huì)問,什么是Linux 設(shè)備驅(qū)動(dòng)模型?你要怎么回答?
這個(gè)問題,突然這么一問,可能你會(huì)愣住不知道怎么回答,因?yàn)長(zhǎng)inux 設(shè)備驅(qū)動(dòng)模型是一個(gè)比較整體的概念,Linux 內(nèi)核一半的代碼都是設(shè)備驅(qū)動(dòng),怎么管理設(shè)備驅(qū)動(dòng),怎么抽象,怎么簡(jiǎn)化驅(qū)動(dòng)開發(fā)的工作,這就是設(shè)備驅(qū)動(dòng)模型要干的事情
其實(shí)你不懂也沒關(guān)系,你反問下面試官,你是如何理解設(shè)備驅(qū)動(dòng)模型的,雖然面試失敗了,但是你學(xué)到東西了啊,崗位那么多,下一家可能就是你人生的巔峰呢。
Linux 設(shè)備驅(qū)動(dòng)模型,說(shuō)到這個(gè)部分,就不得不提幾個(gè)重要的東西,BUS(總線),Class(類),Device(設(shè)備),Driver(驅(qū)動(dòng))。
?Bus(總線):?Linux 把總線設(shè)計(jì)成一個(gè)道路,所有的設(shè)備都都必須掛載在總線上面,你可以理解為,所有的車子都必須開在高速路上,要不然就不遵守規(guī)則了。
Class(分類):?在Linux設(shè)備模型中,Class的概念非常類似面向?qū)ο蟪绦蛟O(shè)計(jì)中的Class(類),它主要是集合具有相似功能或?qū)傩缘脑O(shè)備,這樣就可以抽象出一套可以在多個(gè)設(shè)備之間共用的數(shù)據(jù)結(jié)構(gòu)和接口函數(shù)。塊設(shè)備,字符設(shè)備,網(wǎng)絡(luò)設(shè)備這些可以理解為大類。
Device(設(shè)備):?抽象系統(tǒng)中所有的硬件設(shè)備,描述它的名字、屬性、從屬的Bus、從屬的Class等信息,我們正常些驅(qū)動(dòng),還會(huì)寫上這個(gè)設(shè)備的一些硬件資源,中斷口,復(fù)位口,I2C地址等等。
Device Driver(驅(qū)動(dòng)):?Linux設(shè)備模型用Driver抽象硬件設(shè)備的驅(qū)動(dòng)程序,它包含設(shè)備初始化、電源管理相關(guān)的接口實(shí)現(xiàn)。而Linux內(nèi)核中的驅(qū)動(dòng)開發(fā),基本都圍繞該抽象進(jìn)行(實(shí)現(xiàn)所規(guī)定的接口函數(shù)),如果有3個(gè)一樣的設(shè)備,可以使用同一個(gè)驅(qū)動(dòng)。

kobject 是什么?
kobject 就是一個(gè)結(jié)構(gòu)體而已,別看只是一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體可以說(shuō)是串聯(lián)了設(shè)備驅(qū)動(dòng)里面的所有東西,設(shè)備驅(qū)動(dòng)模型都是靠這個(gè)來(lái)穿針引線的,嗯,我覺得用穿針引線這個(gè)詞語(yǔ)非常好,非常妙。每個(gè)kobject對(duì)應(yīng)/sys/目錄下面的一個(gè)目錄,name指定的就是這個(gè)目錄的名字。
既然kobject是對(duì)應(yīng)/sys/下面的一個(gè)目錄,那么kset是什么呢?好吧,kset也就只是一個(gè)結(jié)構(gòu)體而已,這個(gè)結(jié)構(gòu)體里面引用了kobject,這個(gè)應(yīng)該是C語(yǔ)言的巧妙之處,使用這樣的方式實(shí)現(xiàn)繼承的關(guān)系,我包含里的類型,使用起來(lái)就是kobject是我的基類,通過這個(gè)基類我再創(chuàng)造出一個(gè)新的類,這個(gè)類的名字就是kset,類那個(gè)是C++的說(shuō)法,在C里面就是一個(gè)結(jié)構(gòu)體了。僅此而已。
既然我們知道 kobject是一個(gè)目錄,那么kset是kobject的高級(jí)體,那么kset也就是一個(gè)目錄,這個(gè)目錄的名字也就是kobject來(lái)指定的,而且kset 里面有一個(gè)鏈表,可以看出來(lái),kset就是一個(gè)類別的kobject的集合,比如bus目錄下面,就全部是bus相關(guān)的,i2c是一個(gè)Bus,platform也是一個(gè)bus,等等。



【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??


container_of宏
之前寫過文章說(shuō)明這個(gè)宏的作用,分析了實(shí)現(xiàn)的過程,實(shí)際上就是一個(gè),如果我們知道一個(gè)結(jié)構(gòu)體成員變量,可以通過這個(gè)結(jié)構(gòu)體成員變量獲取這個(gè)結(jié)構(gòu)體的指針。
container_of宏解析

實(shí)例分析
Makefile:

設(shè)備驅(qū)動(dòng)使用kobject
看下面這個(gè)圖片,我們看到設(shè)備驅(qū)動(dòng)使用kobject 的流程


原文作者:嵌入式Linux
