最近看到一篇國外關於Linux核心入門的比較好的指南,於是就嘗試翻譯了一下。由於是第一次嘗試翻譯,加之英語水平有限,錯誤在所難免,歡迎拍磚!
由於沒有大段的時間來做這個,一下翻譯完是肯定不可能的,故每天翻譯一部分。轉載請指明出處,尊重別人的勞動成功,謝謝!
編寫系統驅動:簡單指南
像一個核心開發人員一樣編寫Linux裝置驅動的簡要介紹
作者:Xavier Calbet
2006-04-26
預備知識要求:
為了能夠開發Linux核心驅動,具備下列知識是必要的:
l C 編程經驗:需要深入瞭解一些C語言開發經驗,例如指標的使用,位操縱函數等。
l 微處理器編程:瞭解微電腦內部工作原理是很有必要的:記憶體編址、中斷等。這些內容對於一個組合語言編程者來說應該會很熟悉。
Linux中會有好幾種不同的裝置。為了簡潔,本文只介紹了以模組形式載入的字元裝置驅動。使用的核心版本是2.6.x(特別地,是在Debian Sarge下的2.6.8核心,目前這個版本在Debian下是穩定的)。
使用者空間和核心空間:
當你在編寫裝置驅動的時候,你必須能夠區分“使用者空間”和“核心空間”
l 核心空間:Linux(核心)使用一種簡單而且有效方式來管理電腦的硬體,並為使用者提供了一種簡單而又統一的介面。相同地,核心,特別是它的的裝置驅動,就充當了介於終端使用者或者程式員與硬體之間的橋樑。任何組成核心的一部分的子程式或者函數都(例如模組和裝置驅動)被認為是核心空間的一部分。
l 使用者空間:終端使用者程式,例如Unix shell或者其他基於GUI的應用程式(例如Kpresenter)都是使用者空間的一部分。很明顯,這些應用程式都需要和系統硬體進行互動。但是,他們不會親自去完成,而是通過核心支援函數來完成。
所有這些表1所示:
表1 應用程式所在的使用者空間,模組或者裝置驅動所在的核心空間
使用者空間和核心空間的介面函數
核心提供給使用者空間一些子程式和函數,通過這些子程式和函數中斷應用編程者可以完成和硬體的互動。通常,在Unix或者Linux系統當中,這些會話交換式通過讀寫檔案的子程式或者函數來完成的。因為在Unix系統當中,在使用者角度,裝置是被當中檔案來看待的。
另一方面,在核心空間,Linux也提供了若干個函數或者子程式來完成底層和硬體直接互動的任務,同時允許將核心的資訊傳遞到使用者空間。
通常,在使用者空間允許使用裝置或者檔案的每個函數,在核心都存在函數與之對等(這些函數可以完成將核心空間的資訊傳遞到使用者空間,反之亦然)。這些都表示在下表當中。目前這個表格還是空白的,當之後引入不同裝置驅動概念後我們會將其填滿。
Events |
User functions |
Kernel functions |
Load module |
|
|
Open device |
|
|
Read device |
|
|
Write device |
|
|
Close deviece |
|
|
Remove module |
|
|
表 裝置驅動事件和與對應的在使用者空間和核心空間的互動函數