2014年6月25日 星期三

Linux Driver 開發概述

Device Driver 簡稱 Driver
裝置驅動程式用來將硬體本身的功能告訴作業系統,可視驅動程式爲硬體的靈魂,同時也可稱驅動程式為硬體和系統之間的橋樑。

裝置驅動程式可分為下列三類:
1. 字元裝置
    一個位元組(Byte)一個位元組讀取資料的裝置,一般會在驅動層實現 open(), close(), read(), write() and ioctl()等函數。
2. 區塊裝置
    一般是像磁碟一樣的裝置,進行讀寫時,每次只能傳輸一個或多個區塊,但是Linux可以讓應用程式像存取字元裝置一樣的存取區塊裝置。
3. 網路裝置
    主要是面對資料封包的接收和發送而設計的,網路裝置在Linux中是一種很特殊的裝置,不像字元裝置與區塊裝置的API函數,而是實現了一種通訊端界面,任何網路資料傳輸都可以透過通訊端來完成。

CPU有兩種指令:
1. 特權指令:Kernel mode可使用
2. 普通指令:Kernel mode and User mode可使用

模組是可以在執行時加入核心的程式,Linux kernel支援很多種模組,驅動程式就是其中最重要的一種,甚至檔案系統也可以寫成一個模組。利用insmod指令將模組加入正在執行的核心,也可用rmmod指令將一個未使用的模組從核心中刪除。

載入模組有兩種類別:
1. 靜態載入:模組在核心啟動時載入
2. 動態載入:在核心已經執行時載入



開發驅動程式該注意的事項:
1. 核心及驅動程式開發時無法存取C函數庫,開發時必須使用GNU C,因為Linux從一開始就使用GNU C,雖然開發時無法使用C函數庫,但是大部分常用的C函數已經在核心中實現了。
2. 核心支援非同步終端, 搶占 and SMP,因此核心及驅動程式開發時必須時刻注意 同步和同時。
3. 核心堆疊的大小是固定的,32位元的核心堆疊為8KB,64位元的核心堆疊為16K。儘量不要使用遞迴呼叫。
4. 缺乏記憶體保護機制。
5. 很難使用浮點數,應該使用整數。
6. 核心及驅動程式開發要考慮可攜性,因為對於不同平台,驅動程式是不相容的。

對於驅動程式來說,可攜性需要注意以下問題:
1. 考慮位元組順序,Big-Endian or Little-Endian
2. 同一種裝置的驅動程式,若使用的晶片不同,也應該撰寫不同的驅動程式,但是要注意應該給使用者提供一個統一的程式設計介面。
3. 儘量使用巨集代替裝置通訊埠的實體位置,並且利用ifdefine巨集來確定版本等資訊
4. 針對不同處理器,應該使用該處理器的相關函數。

Linux內核子系統包括:
1. 處理程序管理
    處理程序(Process)是作業系統分配資源的基本單位也是CPU排程的基本單位。處理程序是程式執行的一個實例,Linux將處理程序分為三個狀態(就緒ready, 執行running and 阻塞waiting)。
    Ready: 處理程序具有處理器外的其他資源,process不執行。當CPU空閒時,process就被排程來執行。
    Running: Process先處於Ready狀態,再獲得CPU資源後就能進入Running,此時程式正在執行。
    Waiting: Process因為等待某種事件的發生而暫時無法執行
2. 記憶體管理
3. 檔案管理
    在Linux中幾乎每個物件都可以當作檔案來看待,最常見的就是裝置檔案,將裝置當成檔案來看待,使我們可以像操作檔案一樣操作裝置。
4. 裝置管理
    主要工作是完成資料從裝置到記憶體的傳輸,一個完整的資料傳輸過程如下,資料首先從裝置傳入記憶體,然後CPU對其進行處理,處理完後將數據傳入記憶體或設備中。
5. 網路管理

沒有留言:

張貼留言