開發Linux系統裝置驅動程式並不難(轉)
開發Linux系統裝置驅動程式並不難(轉)[@more@] 最近看了好多核心程式設計和驅動開發的教程,也參考了一些開發板上的例子。總結下來並不是想象的高不可及。開發驅動程式需要對 核心有一定的瞭解,並不是非要解讀的多麼透徹。
以下所指的驅動程式都是針對具體裝置,並做成模組動態載入方式工作的。驅動程式框架是分層的,有些驅動並不是針對具體裝置的如ext2檔案系統的驅動,tcp/ip協議的驅動等等,這些可以稱之為軟碟機動,工作於其他具體裝置驅動程式之上。由於我們做的是嵌入式開發,僅僅編寫最低層的裝置驅動就可以了。
裝置驅動程式通常分為字元裝置和塊裝置,這是泛指分類。區別就是有緩衝區的就是塊裝置,無緩衝區的就是字元裝置。但是在linux原始碼的drivers目錄下,不僅僅有block和char目錄,還有其他的各種裝置,那是因為有些開發人員為了方便並沒有根據這種分類而是採用了更為直觀的功能分類。比如sound目錄,大家一看就知道里面存放的是各種音訊驅動了。
既然是裝置驅動,我們先看看裝置在linux中如何描述。在/dev目錄下存放有系統支援的所有裝置。裝置又可以成為裝置節點,如果往系統中新增新裝置,必須在/dev下建立相應的節點。一個裝置驅動程式往往可以驅動若干裝置,裝置透過主裝置號和次裝置號區分。同一主裝置號的所有裝置使用一個驅動程式。次裝置號為驅動程式提供瞭如何區分不同裝置的入口。有些情況下還可以根據次裝置號的高低4位區分裝置的工作型別。舉個例子以hda0-hda4和hdb0-hdb4的關係,hda代表第一塊硬碟,hdb代表第二塊硬碟,由於大家都是硬碟因此此用同一驅動程式,所以had和hdb的主裝置號一致。Hda後面的序號分別代表了該硬碟上的分割槽資訊,為了有效的區分這些分割槽,次裝置的設定做了分類,該位元組的高四位代表不同的硬碟的,而低4位代表分割槽索引。
瞭解了裝置的描述,我們再看看軟體的環境。開發linux下驅動程式與你所使用的發行版本無關,不管你用redhat或mandrake等,都無所謂。真正影響你的是你當前所用的核心的版本。如果你打算在目標板上用2.4.x的核心,而你的主機上的linux用的卻是2.6.x的系統,你的開發將是件麻煩的事。問題出在什麼地方,你慢慢往下看就明白了。因此我們建議主機和目標系統採用同樣的核心版本。
開發驅動過程中,由於採用的是核心引用,在程式編譯時是不需要連結到庫檔案的。因此lib路徑對我們就沒什麼用了。但是由於需要引用核心提供的各種資料結構和介面,必須設定好相應版本的include路徑,通常在/usr/include。在/usr/include下有好多標頭檔案,真正我們需要的只有/usr/include/linux目錄和/usr/include/asm目錄。
驅動程式設計中有兩個函式和三個資料結構最重要。Init_module和cleanup_module這兩個函式。File_operations,inode,file這三個資料結構,在linux/fs.h中定義。至於其他的象記憶體操作,i/o操作,定時器,中斷,DMA等待都是提升部分了。
以下所指的驅動程式都是針對具體裝置,並做成模組動態載入方式工作的。驅動程式框架是分層的,有些驅動並不是針對具體裝置的如ext2檔案系統的驅動,tcp/ip協議的驅動等等,這些可以稱之為軟碟機動,工作於其他具體裝置驅動程式之上。由於我們做的是嵌入式開發,僅僅編寫最低層的裝置驅動就可以了。
裝置驅動程式通常分為字元裝置和塊裝置,這是泛指分類。區別就是有緩衝區的就是塊裝置,無緩衝區的就是字元裝置。但是在linux原始碼的drivers目錄下,不僅僅有block和char目錄,還有其他的各種裝置,那是因為有些開發人員為了方便並沒有根據這種分類而是採用了更為直觀的功能分類。比如sound目錄,大家一看就知道里面存放的是各種音訊驅動了。
既然是裝置驅動,我們先看看裝置在linux中如何描述。在/dev目錄下存放有系統支援的所有裝置。裝置又可以成為裝置節點,如果往系統中新增新裝置,必須在/dev下建立相應的節點。一個裝置驅動程式往往可以驅動若干裝置,裝置透過主裝置號和次裝置號區分。同一主裝置號的所有裝置使用一個驅動程式。次裝置號為驅動程式提供瞭如何區分不同裝置的入口。有些情況下還可以根據次裝置號的高低4位區分裝置的工作型別。舉個例子以hda0-hda4和hdb0-hdb4的關係,hda代表第一塊硬碟,hdb代表第二塊硬碟,由於大家都是硬碟因此此用同一驅動程式,所以had和hdb的主裝置號一致。Hda後面的序號分別代表了該硬碟上的分割槽資訊,為了有效的區分這些分割槽,次裝置的設定做了分類,該位元組的高四位代表不同的硬碟的,而低4位代表分割槽索引。
瞭解了裝置的描述,我們再看看軟體的環境。開發linux下驅動程式與你所使用的發行版本無關,不管你用redhat或mandrake等,都無所謂。真正影響你的是你當前所用的核心的版本。如果你打算在目標板上用2.4.x的核心,而你的主機上的linux用的卻是2.6.x的系統,你的開發將是件麻煩的事。問題出在什麼地方,你慢慢往下看就明白了。因此我們建議主機和目標系統採用同樣的核心版本。
開發驅動過程中,由於採用的是核心引用,在程式編譯時是不需要連結到庫檔案的。因此lib路徑對我們就沒什麼用了。但是由於需要引用核心提供的各種資料結構和介面,必須設定好相應版本的include路徑,通常在/usr/include。在/usr/include下有好多標頭檔案,真正我們需要的只有/usr/include/linux目錄和/usr/include/asm目錄。
驅動程式設計中有兩個函式和三個資料結構最重要。Init_module和cleanup_module這兩個函式。File_operations,inode,file這三個資料結構,在linux/fs.h中定義。至於其他的象記憶體操作,i/o操作,定時器,中斷,DMA等待都是提升部分了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-960637/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux裝置驅動程式 (轉)Linux
- SCO UNIX 下裝置驅動程式開發 (轉)
- SCO UNIX 下裝置驅動程式開發(轉)
- LINUX下的裝置驅動程式 (轉)Linux
- Windows NT 裝置驅動程式開發基礎(1) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(3) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(2) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(4) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(5) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(7) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(6) (轉)Windows
- Windows NT 裝置驅動程式開發基礎(8) (轉)Windows
- Linux下的硬體驅動——USB裝置(下)(驅動開發部分)(轉)Linux
- Linux驅動開發筆記(四):裝置驅動介紹、熟悉雜項裝置驅動和ubuntu開發雜項裝置DemoLinux筆記Ubuntu
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- Linux裝置驅動之字元裝置驅動Linux字元
- 《Linux裝置驅動開發詳解(第2版)》——第1章Linux裝置驅動概述及開發環境構建1.1裝置驅動的作用Linux開發環境
- 詳解Linux作業系統裝置驅動相容性(轉)Linux作業系統
- Linux的input輸入子系統:裝置驅動之按鍵驅動Linux
- 無作業系統時的裝置驅動和有作業系統時的裝置驅動作業系統
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- 深入淺出:Linux裝置驅動之字元裝置驅動Linux字元
- 乾坤合一:Linux裝置驅動之塊裝置驅動Linux
- 深入淺出分析Linux裝置驅動程式中斷(轉)Linux
- Linux驅動開發: Ubuntu(PC機)系統上編譯驅動並載入測試LinuxUbuntu編譯
- Linux塊裝置驅動Linux
- 蛻變成蝶:Linux裝置驅動之字元裝置驅動Linux字元
- 蛻變成蝶~Linux裝置驅動之字元裝置驅動Linux字元
- 作業系統——裝置驅動和檔案系統作業系統
- Linux裝置驅動程式設計之阻塞與非阻塞(轉)Linux程式設計
- 向嵌入式Linux移植實時裝置驅動程式(轉)Linux
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- Linux裝置驅動開發詳解:入門與程式設計實踐Linux程式設計
- linux裝置驅動中的併發控制Linux
- Linux驅動實踐:如何編寫【 GPIO 】裝置的驅動程式?Linux
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- 【linux】驅動-7-平臺裝置驅動Linux
- Linux下的硬體驅動——USB裝置(上)(驅動配置部分)(轉)Linux