天天看點

《Linux裝置驅動開發詳解 A》導讀

linux從未停歇前進的腳步。linus torvalds,世界上最偉大的程式員之一,linux核心的創始人,git的締造者,現在仍然在沒日沒夜地合并更新檔、更新核心。做技術的人,從來沒有終南捷徑,拼得就是坐冷闆凳的傻勁。

這是一個連閱讀都被碎片化的時代,在這樣一個時代,人們趨向于激進、浮躁,内心的不安甯使我們極難靜下心來研究什麼。我見過許多linux工程師,他們的履歷上寫着“精通”linux核心,有多年的工作經驗,而他們的“精通”卻隻是把某個寄存器從0改成1,從1改成0的不斷重複;我也見過許多linux工程師,他們終日埋頭苦幹,敲打着自己的機器和電路闆,卻從未冷靜下來思考,并不斷重構和升華自己的知識體系。

這是要把“牢底”坐穿的程式員,這樣“忙忙碌碌”的程式員,從來都不算是好程式員。

對于優秀的程式員,其最優秀的品質是能夠心平氣和地學習與思考問題,透析代碼背後的架構、原理和設計思想。沒有思想的代碼是垃圾代碼,沒有思想的程式員,隻是在完成低水準重複建設的體力活。很多程式員從不過問自己寫的代碼最後在機器裡面是怎麼跑的,很多事情莫名其妙地發生了,很多bug莫名其妙地消失了……他們永遠都在得過且過。

由此,衍生出了本書的第一個出發點,那就是帶給讀者更多關于linux開發思想的講解,幫助讀者奠定根基。本書呈現給讀者的更多的是一種思考方法,而不是知識點的簡單羅列。

本書除對基礎理論部分進行了詳細的講解外,還加強了對驅動程式設計所涉及的linux核心最底層機理的講解,内容包括中斷、定時器、程序生命周期、uevent、并發、編譯亂序、執行亂序、等待隊列、i/o模型、記憶體管理等。這些知識點非常重要,是真正證明程式員了解了linux的部分内容,程式員隻有打好根基,才能遊刃有餘。

本書沒有大量描述各種具體驅動類型的章節,如sound、pci、mtd、tty等,而将更多的焦點轉移到了驅動程式設計背後的核心原理,并試圖從linux核心的上百個驅動子系統中尋找出内部規律,以培養讀者舉一反三的能力。

linux核心有上百個驅動子系統,這一點從核心的drivers子目錄中就可以看出來:

好吧,傻子才會一個目錄一個目錄地去看,一個目錄一個目錄地從頭學起。我們勢必要尋找各種驅動子系統的共性,摸索規律。在本書中,我們将更多地看到各驅動子系統的類比,以及驅動子系統的階層化設計。

技術工作從來都不能一勞永逸。世界變化得太快,目前技術革新的速度數倍于我們父輩、祖輩、祖祖輩經曆過的任何時代。證明你是“真球迷”還是“僞球迷”的時候到了,這個時代是僞程式員的地獄,也是真程式員的天堂。

從浩如煙海的知識體系、不斷更新的軟體版本中終生學習,不斷攻克一個個挑戰,擷取新養分,尋找新靈感,這實在是黑暗的碼農生涯中不斷閃現的璀璨光芒。

linux的核心版本不斷更新,出現了linux 3.0、linux 3.1、linux 3.2、…、linux 3.19、linux 4.0、linux 4.1,變化的是軟體的架構,不變的是linus的熱情。

這無疑也是本書的第二個出發點,更新linux驅動程式設計的知識體系以迎合最新的時代需求。是以,本書有大量關于裝置樹、arm linux移植、linux電源管理、gpio、時鐘、定時器、pinmux、dma等内容。我們的操作平台也轉移到了qemu模拟的4核cortex-a9電路闆上,書中的執行個體基本都轉移到了市面流行的新晶片上。

最近兩三年,老是聽許多程式員抱怨,市面上缺乏講解新核心的資料、缺乏從頭到尾講解裝置樹的資料,但是我想說,這實在不是什麼難點。難點仍然是本書基于第一個出發點要解決的問題,如果有好的基礎,以優秀程式員極強的學習能力,應該很快就可以掌握這些新知識。機制沒有變,變化的隻是政策。

是以學習能力也是優秀程式員的又一個重要品質。沒有人生下來就是天才,良好的學習能力也是通過後天的不斷學習培養的。可以說,學得越多的人,學新東西的速度一定越快,學習能力也變得越強。因為,知識的共通性實在太多。

讀者在閱讀本書時,不應該企圖把它當成一本工具書和查api的書,而是應該把它當作一本梳理理論體系、開發思想、軟體架構的書。唯如此,我們才能适應未來新的變化。

<a href="https://yq.aliyun.com/articles/109254">1.2 無作業系統時的裝置驅動</a>

<a href="https://yq.aliyun.com/articles/109256">1.3 有作業系統時的裝置驅動</a>

<a href="https://yq.aliyun.com/articles/109259">1.4 linux裝置驅動</a>

<a href="https://yq.aliyun.com/articles/109262">1.5 linux裝置驅動的開發環境建構</a>

<a href="https://yq.aliyun.com/articles/109291">2.2 存儲器</a>

[2.3 接口與總294)

<a href="https://yq.aliyun.com/articles/109298">2.4 cpld和fpga</a>

<a href="https://yq.aliyun.com/articles/109298">2.5 原理圖分析</a>

<a href="https://yq.aliyun.com/articles/109303">2.6 硬體時序分析</a>

<a href="https://yq.aliyun.com/articles/109306/">2.7 晶片資料手冊閱讀方法</a>

<a href="https://yq.aliyun.com/articles/109309">2.8 儀器儀表使用</a>

<a href="https://yq.aliyun.com/articles/109320/">3.2 linux 2.6後的核心特點</a>

<a href="https://yq.aliyun.com/articles/109324">3.3 linux核心的組成</a>

<a href="https://yq.aliyun.com/articles/109330">3.4 linux核心的編譯及加載</a>

<a href="https://yq.aliyun.com/articles/109337">3.5 linux下的c程式設計特點</a>

<a href="https://yq.aliyun.com/articles/109342">3.6 工具鍊</a>

<a href="https://yq.aliyun.com/articles/109343">3.7 實驗室建設</a>

<a href="https://yq.aliyun.com/articles/109346">3.8 序列槽工具</a>

繼續閱讀