宋寶華:Linux設備驅動框架里的設計模式之——模板方法(Template Method)

本文系轉載化漆,著作權歸作者所有苗缩。商業(yè)轉載請聯(lián)系作者獲得授權病游,非商業(yè)轉載請注明出處侨拦。

作者: 宋寶華

來源: 微信公眾號linux閱碼場(id: linuxdev)


前言

《設計模式》這本經(jīng)典的書里面定義了20多種設計模式,雖然都是面向對象的赠幕,似乎需要C++俄精、Java這樣的語言才能實現(xiàn),但是根據(jù)筆者前面反復強調(diào)的榕堰,Linux內(nèi)核雖然是用C語言和匯編語言寫成竖慧,但是其實也到處充滿了面向對象的設計。面向對象更多的是一種思想逆屡,而不是一個語言圾旨。我們可以用C語言實現(xiàn)極大的OO,Linux內(nèi)核到處都有OO魏蔗。

模版方法

比如砍的,在Linux的設備驅動框架中,就用了一種非常經(jīng)典簡單的設計模式——模板方法(Template Method)莺治,當然還有一些其他的設計模式廓鞠。而設計模式牛逼的地方在于,高手往往不經(jīng)意之間已經(jīng)用到了設計模式谣旁,甚至自己都不知道床佳。如果高手沒有系統(tǒng)地學習過設計模式,這其實不見得是一個問題榄审。這并不意味著它不懂設計模式夕土,只是他自己都不知道自己用到了哪個模式。而設計模式學習的終極目的瘟判,當然也是忘記設計模式,這個跟練獨孤九劍沒什么區(qū)別角溃,到最后其實是無招勝有招拷获。

模板方法這個模式,強調(diào)定義一個基類减细,這個基類實現(xiàn)了通用的流程和算法匆瓜。比如做一件事情需要經(jīng)過step1()、step2()未蝌、step3()驮吱。那么我們定義一個基類:

image

而其中的step1()、step2()萧吠、step3()左冬、step4()具體如何實現(xiàn)則是因人而異,所以我們從baseClass類里面纸型,繼承出來的類里面拇砰,實現(xiàn)step1()梅忌、step2()、step3()這樣的代碼除破,override掉baseClass里面的函數(shù)牧氮。

image

這樣的設計讓外部不關心derivedClass,因為流程和接口都是在基類的瑰枫。而基類實現(xiàn)的doSomething()成員函數(shù)踱葛,是對外的接口。這個UML關系是非常簡單的:

image

驅動案例

在Linux設備驅動里面光坝,大量存在類似的設計尸诽,我們以NAND為例子。在drivers/mtd/nand/nand_base.c這層里面教馆,定義了NAND的一些操作流程逊谋。

比如寫OOB的代碼:

image

它這個里面要走cmdfunc()、write_buf()土铺、cmdfunc()胶滋、waitfunc()這些步驟,這些步驟悲敷,不管是全世界哪個NAND的硬件究恤,都是一樣的通用的,但是具體的不同的NAND硬件控制器后德,實現(xiàn)這些步驟中涉及到的cmdfunc()等函數(shù)的實現(xiàn)方法卻因人而異部宿。

譬如freescale的版本fsl_elbc_nand.c就是:

image

nand_base.c這個C文件是NAND的中間層,它非常類似我們前面說的實現(xiàn)baseClass這一層的代碼瓢湃,nand_write_oob_std函數(shù)類似baseClass :: doSomething理张。而Linux驅動中定義的nand_chip的各個不同的NAND控制器,對nand_chip這個結構體中成員函數(shù)cmdfunc()绵患、write_buf()等的實現(xiàn)則是各異的雾叭,類似derivedClass里面override掉step1()、step2()落蝙。nand_chip定義在include/linux/mtd/nand.h:

image

這樣的設計织狐,好處是非常明顯的。特定的硬件只用管與自身操作相關的事情筏勒,而通用的流程移迫,都由nand_base搞定,最大程度上減小了具體實例的代碼量管行,也最大程度上復用了中間層的代碼厨埋。

這樣的例子無處不在,比如我們在LCD的中間層:

image

后語

本文后語不搭前言捐顷,請見諒揽咕。最近有很多童鞋詢問筆者悲酷,做Linux驅動有沒有前途?筆者明確地告訴大家:根本沒有前途亲善!但是前途是自己賺的设易,這依賴你從驅動進去,但是從更大的視角出來:

  1. 通過做驅動理解很多OO的架構設計思想蛹头,升華自己高內(nèi)聚和低耦合的理解顿肺,把自己變成一個更高level的software engineer;

  2. 通過做驅動渣蜗,進一步理解Linux本身的進程屠尊、內(nèi)存、IO等知識耕拷,升華對軟件系統(tǒng)和性能分析的理解讼昆,把自己變成一個更高level的技術expert。

如果做了5年驅動骚烧,進入的時候是調(diào)試寄存器搞示波器浸赫,出來的時候還是調(diào)寄存器搞示波器,那自然是完全沒有什么前途的赃绊!

有沒有前途既峡,這個事情,完全是因人而異的碧查。前途是無所謂有运敢,無所謂無的。你如果有抽象忠售、衍生的能力和不斷學習總結的精神传惠,無論是做驅動還是不做驅動,都會是很有前途的事情稻扬。反之涉枫,做什么基本都沒前途。

更多精彩更新中……歡迎關注微信公眾號:linux閱碼場(id: linuxdev)

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腐螟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子困后,更是在濱河造成了極大的恐慌乐纸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摇予,死亡現(xiàn)場離奇詭異汽绢,居然都是意外死亡,警方通過查閱死者的電腦和手機侧戴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門宁昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跌宛,“玉大人,你說我怎么就攤上這事积仗〗校” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵寂曹,是天一觀的道長哎迄。 經(jīng)常有香客問我,道長隆圆,這世上最難降的妖魔是什么漱挚? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮渺氧,結果婚禮上旨涝,老公的妹妹穿的比我還像新娘。我一直安慰自己侣背,他們只是感情好白华,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秃踩,像睡著了一般衬鱼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上憔杨,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天鸟赫,我揣著相機與錄音,去河邊找鬼消别。 笑死抛蚤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的寻狂。 我是一名探鬼主播岁经,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛇券!你這毒婦竟也來了缀壤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纠亚,失蹤者是張志新(化名)和其女友劉穎塘慕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒂胞,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡图呢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤织。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡赴叹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出指蚜,到底是詐尸還是另有隱情乞巧,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布姚炕,位于F島的核電站摊欠,受9級特大地震影響,放射性物質發(fā)生泄漏柱宦。R本人自食惡果不足惜些椒,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掸刊。 院中可真熱鬧免糕,春花似錦、人聲如沸忧侧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚓炬。三九已至松逊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肯夏,已是汗流浹背经宏。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驯击,地道東北人烁兰。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像徊都,于是被迫代替她去往敵國和親沪斟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 姓名:吳兆陽 學號:14020199009 轉自韋東山 嵌牛導讀:對嵌入式初學者暇矫,沒有足夠的視野選擇一個合適投入方...
    吳兆陽閱讀 2,389評論 0 4
  • 學習stm32gpio 學習linux 程序員的三大方向 程序員的方向主之,一般可以分為3類:專業(yè)領域、業(yè)務領域李根、操作...
    王公民閱讀 767評論 0 3
  • 1.初識模板方法模式 定義一個操作中的算法的骨架槽奕,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結...
    王偵閱讀 940評論 0 3
  • 一朱巨、芯片手冊閱讀方法 芯片手冊往往長達數(shù)百頁甚至上千頁,而且全部都是英文枉长,從頭到尾不加區(qū)分地閱讀需要花費非常長的時...
    konishi5202閱讀 1,443評論 0 3
  • 如果冀续,有人跟你交流過后琼讽,跟你說:“你的思想有問題” 很可能是你打擾到他或她了。 或許是他們...
    二十_不惑閱讀 212評論 0 2