序言
Linux是Unix作業系統的一種變種,在Linux下編寫驅動程式的原理和思想完全類似於其他的Unix系統,但它dos或window環境下的驅動程式有很大的區別。在Linux環境下設計驅動程式,思想簡潔,操作方便,功能也很強大,但是支援函數少,只能依賴kernel中的函數,有些常用的操作要自己來編寫,而且調試也不方便。本人這幾周來為實驗室自行研製的一塊多媒體卡編製了驅動程式,獲得了一些經驗,願與Linux fans共用,有不當之處,請予指正。
以下的一些文字主要來源於khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,還有清華BBS上的有關device driver的一些資料. 這些資料有的已經過時,有的還有一些錯誤,我依據自己的實驗結果進行了修正.
一、Linux device driver 的概念
系統調用是作業系統核心和應用程式之間的介面,裝置驅動程式是作業系統核心和機器硬體之間的介面.裝置驅動程式為應用程式屏蔽了硬體的細節,這樣在應用程式看來,硬體裝置只是一個裝置檔案, 應用程式可以象操作普通檔案一樣對硬體裝置進行操作.裝置驅動程式是核心的一部分,它完成以下的功能:
1.對裝置初始化和釋放.
2.把資料從核心傳送到硬體和從硬體讀取資料.
3.讀取應用程式傳送給裝置檔案的資料和回送應用程式請求的資料.
4.檢測和處理裝置出現的錯誤.
在Linux作業系統下有兩類主要的裝置檔案類型,一種是字元裝置,另一種是塊裝置.字元裝置和塊裝置的主要區別是:在對字元裝置發出讀/寫請求時,實際的硬體I/O一般就緊接著發生了,塊裝置則不然,它利用一塊系統記憶體作緩衝區,當使用者進程對裝置請求能滿足使用者的要求,就返回請求的資料,如果不能,就調用請求函數來進行實際的I/O操作.塊裝置是主要針對磁碟等慢速裝置設計的,以免耗費過多的CPU時間來等待.
已經提到,使用者進程是通過裝置檔案來與實際的硬體打交道.每個裝置檔案都都有其檔案屬性(c/b),表示是字元裝置還蔤強檣璞?另外每個檔案都有兩個裝置號,第一個是主裝置號,標識驅動程式,第二個是從裝置號,標識使用同一個裝置驅動程式的不同的硬體裝置,比如有兩個磁碟片,就可以用從裝置號來區分他們.裝置檔案的的主裝置號必須與裝置驅動程式在登記時申請的主裝置號一致,否則使用者進程將無法訪問到驅動程式.
最後必須提到的是,在使用者進程調用驅動程式時,系統進入核心態,這時不再是搶先式調度.也就是說,系統必須在你的驅動程式的子函數返回後才能進行其他的工作.如果你的驅動程式陷入死迴圈,不幸的是你只有重新啟動機器了,然後就是漫長的fsck.//hehe
讀/寫時,它首先察看緩衝區的內容,如果緩衝區的資料
如何編寫Linux作業系統下的裝置驅動程式