2012年6月16日 星期六

個人認為的linux驅動程式學習步驟

linux驅動程式開發的門檻比一般程式設計的門檻高,原因在於對於硬體及韌體的了解需要比一般的更多,相較之下,如web service的開發則傾向設計的門檻比較高,比方說MVC的應用,以及類似DB的設計等等,幾乎是不同的走向

linux驅動程式開發最好對硬體有些了解(本人對硬體就很不了解,花了不少時間填補),再者對於一些作業系統的基本元件,如process、semaphore...等等要有概念,接著了解system programming(指那些system call),跟著可以開始作驅動程式開發

  • 如果是嵌入式系統,可以overview各種cpu、chip、memory、hardware interfaces開始;跟著必須補齊如boot loader、kernel、root system等等概念,oreilly的"建構嵌入式linux系統"是本這方面的好書,相對的PC上的linux就比較沒有這方面的疑問,很多都已經非常的標準化了,變化行不如嵌入式系統大
  • 基本的裝置分類方式character、block、queue,學習linux從高階的角度看待各種設備。
  • 驅動程式IO的元素,如blocking/non-blocking、synchronous/asynchronous、critical section的維護、device/device_memory IO、記憶體的操作(kmalloc、__get_free_page...)、interrupt。因為驅動程式主要就是為了輸入、輸出訊號,這些元素都是必備的
  • 接著了解bus/device/driver的架構、分層(layer)、分離、子系統(input、usb...)的應用。這部份有些書本略過了,真的很難消化,網路上資源不少,但是又很少願意以圖形說明,如果只有自己爬code會很累
  • 在貼近各種bus界面,以及硬體的控制,如PCI、USB、I2C...
  • 其他還有debug的技巧

整體linux的學習過程應該要花上好些時間,再者如果每個部份又不是很熟悉又很容易因為一同栽入,見樹不見林,我想提供一個簡單的方向讓有心的人可以稍微有點概念。
我認為最難的兩個部份,一個是linux driver的架構、各種子系統的設計,其實因為發展了許久,所以開始結構化,但是結構化就是簡化程式碼,但是提昇程式碼之間的相關性,再不了解相關性(如子系統的原理),看code就倍感吃力;其次是各種硬體跟界面的經驗,跟界面也都有他的設計的經驗跟原則,當使用者或者一般程式設計師都有OS幫忙處理,所以現在要寫這一層,就比較吃力一點。最後,當然最好的是身邊有個熟悉的人,可以讓你一直問:P但是這真的是看緣份了

最後應該就是硬體的資訊,這方面不屬於韌體工程是的範疇,但是又有點難分割,在業界有vendor廠商提供主要的幫忙,但是了解愈多愈能幫助自己完成工作

最後我想說,相較於四、五年前現在資料真的多許多,主要是拜android風行之賜,相關資料一下子有了爆炸行的成長

沒有留言:

張貼留言