《嵌入式系統Linux內核開發實戰指南(ARM平臺)》前言及網友問答

王老師博客:http://blog.mcuol.com/User/emblinux/article/9644_1.htm

 

本文節選自王洪輝老師的《嵌入式系統Linux內核開發實戰指南(ARM平臺)》一書

  前言(序)

      20078月,我從上家公司辭職出來,放棄了剛上市公司骨幹中層幹部的職位,放棄了豐厚的待遇。

    自1996年畢業以來,我一直從事嵌入式系統和Linux內核一線技術開發工作,我所承擔的任務和項目基本都是由自己獨立完成,即使擔任了硬件部主管或技術總監職務,我對自己專長的工作仍是親歷親爲的;一方面,自己熱愛這項工作,每攻克一個難題都能體驗到莫大的成就感(相信技術工程師都有過這種體會);另一方面,目前國內做嵌入式系統和Linux內核開發的工程師供不應求,水平高的更是奇缺,相關職位的待遇相對其他職位的偏高,少招一個新員工就爲公司節省一筆開支,減輕一份負擔,所以對於比較簡單和事務性的工作我會安排給其他員工,而難度大的工作我幾乎都親自上陣;我習慣加班,來了興致甚至通宵達旦,憑着這股幹勁,經過多年實踐積累,自己常能在短時間內解決很多人長時間沒有解決的問題;在我工作中接觸到Linux之初,爲了更好更深入地學習嵌入式系統和Linux內核開發技能,我在業餘時間自己花錢設計製作了MC68VZ328S3C4510兩種開發板以及簡易JTAG下載、燒寫線纜,併成功移植、固化mClinux到這兩個開發板上—到目前爲止,我已經在當今流行的各種嵌入式硬件平臺(包括單片機、MC68KPowerPCARMMIPSDSP)和嵌入式操作系統(包括VRTXVxWorksPSOSLinux)上都做過實際開發工作,編寫、移植或者調試過UARTEthernetI2CHDLC+E1LCDKeyboardVFDSCSISATAIDECVBSVGAPCIUSB等接口和設備的驅動程序。

    在與Linux打交道的這麼多年裏,我一心想把這個開放源碼的優秀操作系統吃透,並理所當然地覺得,隨着時間的推移和所做項目的增多,自己一定會逐漸認識Linux內核的真實面目;可是一直以來,每當我想在腦海中對Linux內核各組件及其原理進行全面系統概括描述時卻總是如鯁在喉,不得其解,這讓我心裏一直潛藏着一絲隱憂和茫然:由於不瞭解Linux內核原理,儘管自己能憑藉10多年的工作經驗通過適當方法很快把任務完成、把難題解決,但卻不能在碰到難題一開始就從原理上把握應該從哪兒下手,怎樣做、做什麼,缺乏全局預見性和高瞻遠矚的能力,這種心中“沒底”的感覺驅使我去更深入鑽研、發掘,去力爭做到心中“有底”;這也讓我意識到,雖然經過10多年的勤奮工作,自己已經積累了足夠的工作經驗,不過由於平時很少閱讀理論書籍和Linux內核源代碼,Linux內核原理知識並沒有象我原來想象的那樣自然而然地裝進自己的大腦,所以自己的理論水平仍然很欠缺,要想提高就必需經過一個艱苦的沉澱過程;由於平時工作忙、任務緊,我很少有時間來做系統的總結和歸納,在這種情況下,出於對公司和自己負責任考慮,我決定辭去工作,在家專心、系統研讀Linux內核源代碼,同時也對自己10多年的工作進行一次全面概括和總結。

    我花了半年多時間閱讀針對ARM處理器平臺的Linux 2.6.10內核源代碼,記了2000多頁的源代碼閱讀筆記和心得。20084月,我在家坐不住想去找工作—辭職前,我常開車去兜風或帶家人郊遊,辭職後不久,爲了節省支出,我把車賣了,這半年多時間裏,我除了早晨出去鍛鍊外,一天難得出門,沒有娛樂,沒有朋友交流,沒有旅遊,這對於一個身處物慾橫流的繁華都市鬧市區的人來說會是一種怎樣的生活體驗呢?更何況對於英俊瀟灑、才華橫溢、熱情好動的本人呢(J—於是我在腦海中總結半年多來的學習成果和收穫,雖然感覺眼前比以前亮堂了許多,但仍是朦朦朧朧,似是而非,不得已只好強迫自己繼續坐下去。我把以前的工作筆記、工作總結、自制的開發板全部找出來,又買了幾本介紹Linux內核原理、驅動程序編寫方面的理論書籍,把所有這些與半年多來閱讀Linux 2.6內核源代碼的筆記和心得進行交叉學習,相互印證,加深理解,同時對這些資料再次進行總結、歸納、記筆記、寫心得;到086月,當我再次回頭清理頭緒,翻看新的筆記時,頓然感覺Linux2.6內核的輪廓漸漸清晰起來,我很興奮並突發想象:何不將新的筆記、心得整理完善一下,那樣不就可以編輯成一本介紹嵌入式系統硬件原理及軟硬件設計流程與方法、嵌入式Linux內核原理及開發方法與技能、常見設備工作原理及其驅動程序的編寫方法的完整的書了?聯想到現在越來越多的年輕人開始熱衷於嵌入式系統Linux內核開發這項高科技、高薪工作,卻苦於找不到一本從實戰出發全面深入介紹這方面技術的指導書,他們有的不惜花重金去參加培訓,可是當這些培訓後的部分人到我那面試時,我卻發現他們所學甚淺,不懂原理,不懂技能,只瞭解一點操作流程,有的甚至連基本的開發流程都不熟悉;加上以前在一些嵌入式系統和Linux論壇中看到很多網友呼籲有經驗的開發人員把自己的工作經驗總結一下寫出來供大家參考,這更讓我有了寫這本書的衝動。於是我又耐心坐了3個多月,繼續總結、歸納、提煉、整理、完善,到了089月,原來的筆記和心得就濃縮成了《嵌入式系統Linux內核開發實戰指南(ARM平臺)》我也實現了一次自我超越,從“摸着石頭過河”的尷尬與無奈走向了“不管風吹浪打,勝似閒庭信步”的瀟灑與從容!

    《嵌入式系統Linux內核開發實戰指南(ARM平臺)》包含了我11年的工作筆記、經驗總結,1年多來對ARM處理器平臺Linux 2.6內核源代碼的閱讀心得和體會以及對幾本理論參考書的閱讀筆記和心得,這本書是從這些內容中提煉出來的,是我對自己12年工作和學習的概括與總結。

    《嵌入式系統Linux內核開發實戰指南(ARM平臺)》以嵌入式系統Linux內核開發的整個過程爲線索,按照先硬件後軟件、先易後難的順序編寫。書中內容覆蓋了嵌入式系統Linux內核開發的各個方面,全書由“嵌入式系統硬件開發(共10章)”、“Linux內核開發初步(共6章)”、“Linux 2.6內核原理(共9章)”、“Linux內核開發高級指南(共7章)”四部分組成,共32章。其中“嵌入式系統硬件開發”部分主要以ARM處理器爲例介紹了嵌入式處理器的特點、內部原理以及硬件開發調試流程和方法,還介紹瞭如何製作簡易JTAG線纜和編寫燒寫程序;“Linux內核開發初步”部分主要介紹各種bootloaderLinux開發環境的創建、Linux內核的配置和編譯以及根文件系統的製作,還簡單介紹了uClinux;“Linux 2.6內核原理”部分是本書的核心,該部分以Linux 2.6.10內核源代碼爲基礎深入剖析了Linux 2.6內核的各個組成部分及其實現原理,包括Linux啓動過程、內存管理、進程調度、文件系統、模塊設計、異常中斷處理、軟中斷和工作隊列、併發和競態、設備驅動程序等,是以源代碼閱讀心得和體會+參考書閱讀筆記和心得+源代碼詳細註釋方式編寫的,因爲Linux源代碼是Linux操作系統理論的實踐成果,講解Linux內核理論的同時加上必要的源代碼註釋就會非常直觀,否則恐怕又會是乏味的天書;“Linux內核開發高級指南”部分則介紹了一些比較高級的技能和開發人員平時很少關注的方面,這部分包括Linux系統參數設置、內核調試、內核移植、內核優化、定時器、雜項以及編譯鏈接文件說明等。

    《嵌入式系統Linux內核開發實戰指南(ARM平臺)》適合已經或者志願從事嵌入式系統Linux內核開發各階段、各層次的人員閱讀。初級開發人員包括在校大學生可以從中找到努力的方向;中級開發人員可以從中找到更深層細緻的內容和有效的方法;高級開發人員可以從中發現不少解決難題的點睛之筆—總之我希望並相信這本書能對愛好或從事嵌入式系統和Linux內核開發的讀者有一定幫助,使他們在技術開發的道路上少走一些彎路!

    當然,一本書不可能包括全部細節,Linux 2.6內核源代碼本身就遠不是一本1000多頁的書所能容納的。事實上,隨着寫作的深入,我發現要寫和想寫的東西越來越多,這或許就是知識的擴張效應吧:當我們瞭解的東西很少的時候,未知領域和已知領域的分界線只是一個很小的圈,隨着我們知識的增加和積累,這個圈慢慢向外伸展,越來越大,於是我們就感覺到不懂的東西越來越多而不是越來越少。正是這種感覺激發了人們的求知慾,有多少科學家特別是我們中國的科學家,把自己的一生都默默奉獻給了國家的科學發展事業,成就了中國世界科技大國的地位!他們從不奢望也不屑獲得所謂的“諾貝爾”!—但是無論如何,這本書只能就此告一段落,如果有可能,我會把更多內容和細節寫入下一本書中。

    由於書中內容太多,其中難免出現一些錯別字或文筆不通的現象,也可能會有錯誤,如果讀者碰到這種情況,請在廣泛查閱相關資料並親自實驗的基礎上得出並堅持正確的結論,不要迷信書本和權威,要敢於懷疑,勤于思考和驗證,這樣才能更快地進步,這纔是科學態度。我誠摯期望讀者能向我指出書中的錯誤和不足,這樣我就能與讀者共同進步和提高!

    最後我要特別提到,在學習和寫作的整個過程中,我常看《恰同學少年》—想到那麼多平凡而壯麗的人生,自己一年多來吃的這點“苦”又算得了什麼呢?呵呵,毛毛雨而已!

 

 

2008年12月26日       

嵌入式在線網友  2009-1-29 1:30:03

你好,我是想從單片機轉入到做ARM linux 這方面,我沒有參加培訓班,自己以前做過一年的WINCE5.0 + s3c2440的二次開發,就是買別人的板子,然後公司做裁剪,寫應用程序。後來又做回到單片機了,想有往嵌入式方面發展,想多多請教請教你。該如何入門呢?
王洪輝  2009-1-29 9:58:13
其實你已經入門了,只是你現在可能偏重於應用方面的知識;如果想轉入底層驅動和內核方面開發,那麼確實還需要做不少事情,總的來說做應用開發比做底層和內核開發容易得多,應用方面的開發的關鍵在於理解用戶需求和個人的編程技巧;而底層軟件開發則要跟硬件、內核,要想做好底層軟件開發必須能看懂硬件原理、熟悉硬件芯片和硬件設備手冊、理解內核原理,還要有豐富的硬件調試經驗,因爲底層軟件一點出問題可能是硬件設計的問題也可能是軟件編程的失誤;
如果你確實想轉入嵌入式底層和內核開發,那麼我建議你自己參考網上的一些開發板自己去設計製作一塊電路板,然後自己移植、boot起一個Linux內核,完成了這些,你就已經瞭解了嵌入式Linux內核開發的整個流程,下一步就是多閱讀芯片和設備手冊,瞭解芯片和設備的工作原理和操作方法,最後就是深入理解Linux內核的組成結構和實現原理;要完成所有這些是比較辛苦的,沒有幾年是下不來的,特別是Linux內核原理,當然可以找一些參考書,我自然要向你推薦我的這本《嵌入式系統Linux內核開發實戰指南(ARM平臺)》,有了這本書你幾乎不用再看其它任何書(如果你要學彙編還要看具體處理器的彙編語言相關書籍),這本書的內容涵蓋了嵌入式系統Linux內核開發的各個方面,初級(流程)、中級(技能)、高級(深層原理)都包括,附帶的CD中還有我自己設計製作的MC68VZ328和S3C4510兩塊開發板的原理圖、PCB圖以及uClinux源代碼和交叉開發環境,你可以在看懂、理解原理圖的基礎上直接用盤中的PCB圖去制板,然後自己買器件、焊接、調試,再把盤中的uClinux在板子上跑起來,這樣第一步你就完成了;
第二步就是要多做,爭取把各種架構的處理器(單片機、MC68K、ARM、PowerPC、MIPS)開發平臺和各種設備的驅動都做一遍,積累經驗,這樣你的開發技能就會得到很大提高;
最後一步就是研究Linux內核原理,這一步是最難的,一定要多讀源代碼,純理論書籍只能作參考,沒有太大的實際意義,最最根本的就是讀代碼,要下真功夫,否則是不會有成效的,我的這本書就是從內核代碼分析入手來闡述Linux內核原理的,可以引導讀者自己去閱讀理解Linux內核代碼,Linux代碼就是一個完整操作系統的優秀典範,就是操作系統理論的一個實現,讀Linux代碼就是實踐,這是必須的;
希望你一些順利,不過要做好吃苦的思想準備,還有就是要堅持!
  嵌入式在線網友  2009-2-26 10:53:14
王老師你好,我是從事linux應用層的軟件開發,工作了幾個月時間,平時工作只需懂得使用別人設計好的硬件設備,不懂硬件,該如何入門呢?
王洪輝  2009-2-28 10:11:44
你可以看一下我的博客中的“嵌入式系統Linux內核開發學習指導框圖 ”一文還有我在博客中的一些評論文章,都詳細提到了應該怎樣開始學習嵌入式Linux內核開發,這裏我也建議你自己花1000來塊錢去做一塊小開發板,自己焊接、調試,自己編譯、下載、固化Linux內核,走一遍這個過程你的基本功就練好了,可以參考或直接使用我的《嵌入式系統Linux內核開發實戰指南(ARM平臺)》一書中的S3C4510和JTAG線纜的原理和PCB圖去制板,這本書這周就可以上市,可以到北京的書店買到,下週全國各地的書店都可以拿到書,如果你實在不想自己做板子,那麼可以花幾百元到市場上去買一塊S3C2410或S3C2440的開發板自己學着編譯、下載、固化Linux內核,但這樣做你就會少學到很多硬件調試相關的知識和技能,而這些對你將來做底層軟件調試是有很大幫助的。
嵌入式在線網友  2009-3-1 14:37:36
王老師 您好
我想問下一個初學者首先需要掌握這一塊那方面的知識 怎麼樣才能算入門呢··後續還要掌握哪方面的知識
王洪輝  2009-3-1 16:17:42

在我看來,要學習嵌入式軟硬件開發最起碼要做到:1)能夠自己設計、調試主板;2)自己編寫、調試主板各功能模塊的測試程序;這是嵌入式開發人員必備的基本功;然後就是寫一些外設的驅動程序,這算是中級的;如果還要學Linux,那麼至少應該在自己做的板子上boot起一個Linux內核纔算對嵌入式Linux內核開發流程有了基本瞭解;然後就是閱讀、移植或者自己編寫Linux下的各種設備驅動程序;到此只能算是嵌入式Linux的中級開發人員,如果要想繼續提高,就要自己多做項目,把各種架構類型的處理器平臺都做一遍,積累豐富的開發經驗和技能,與此同時多讀Linux內核源代碼,前期可以只是圍繞接觸比較多的設備驅動部分源代碼,這樣你就可以逐漸成爲嵌入式Linux內核高手了;如果你還想成爲Linux內核專家,那就請你通讀Linux內核各個核心組件的源代碼,等你理解了Linux內核每個組件的實現原理,你自然就成了Linux內核專家了,那時你也可以開始試着自己寫操作系統了!不過這條路很難走,要有思想準備!
祝你順利!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章