- 相關推薦
于PCI9656設備驅動程序的Linux2.6內核研究
摘要:本文以64位PCI總線接口芯片PCI9656的設備驅動程序為基礎,比較了Linux2.6內核與2.4內核的區(qū)別,設計與開發(fā)了在Linux 2.6內核下PCI9656設備驅動程序,進而研究了2.6內核的內存和中斷管理機制。關鍵字:Linux2.6;設備驅動程序;PCI9656
1 引言
Linux操作系統(tǒng)因為其高效、安全、可動態(tài)加載及源代碼開放等特點,深受設備驅動程序開發(fā)人員的喜愛。系統(tǒng)內核大部分獨立于底層硬件運行,用戶無需關心硬件問題,而用戶操作是通過一組標準化的調用來完成。設備驅動程序的任務是將這些調用映射到作用于實際硬件設備的特定操作上,該編程接口能夠使得驅動程序獨立于內核的其他部分來搭建,在需要時才動態(tài)加載到內核。這種模塊化的特點,使得Linux設備驅動程序的編寫過程變得清晰簡單。
目前,為滿足日益龐大的數(shù)據(jù)處理需要,基于64位PCI總線接口設備的研究開發(fā)顯得尤為重要。因而本文將基于PLX公司推出的PCI總線接口芯片PCI9656,設計開發(fā)在Linux2.6內核下的設備驅動程序,進而對2.6內核的內存和中斷管理機制進行分析研究。
2 Linux2.6與2.4內核的比較
2.1 系統(tǒng)穩(wěn)定性
為了徹底防止對正在被使用的內核模塊進行錯誤操作,2.6內核在加載和導出內核模塊方面都較2.4內核進行了改進,避免了用戶執(zhí)行將導致系統(tǒng)崩潰的操作,例如強制刪除模塊等。同時,當驅動程序需要在多個文件中包含<linux/module.h>頭文件時,不必定義宏__NO_VERSION__來檢查內核的版本。
2.2 統(tǒng)一設備模型
統(tǒng)一設備模型的創(chuàng)建是2.6內核最重要的變化之一。它促進了模塊接口的標準化,其目的是更好地控制和管理設備,主要包括:更準確地確定系統(tǒng)設備,更高效的進行電源管理以及改進的系統(tǒng)總線結構管理。
2.3 內核基礎設施
2.6內核為了區(qū)別以.o為擴展名的常規(guī)對象文件,將內核模塊的擴展名改為.ko。相對于2.4內核下系統(tǒng)所支持的RAM為4GB而言,2.6內核下系統(tǒng)支持更大數(shù)量的RAM,在分頁模式下最高可達64GB。同時,2.6內核優(yōu)化了I/O調度器,確保不會有進程駐留在隊列中過長時間等待輸入/輸出操作,使得I/O操作的響應更為迅速。
2.4 外部設備
在2.4內核中有約束大型系統(tǒng)的限制,比如支持的每一類設備的最大數(shù)量為256。而2.6內核則徹底地打破了這些限制,可以支持4095種主要的設備類型,每一個單獨的類型又可以支持超過一百萬個的子設備。
3 Linux2.6內核下PCI設備驅動程序的設計
3.1 PCI設備驅動程序中核心數(shù)據(jù)結構
在2.6內核下使用file_operations數(shù)據(jù)結構,來建立設備驅動程序中的函數(shù)與主設備號(major number)之間的對應關系。該數(shù)據(jù)結構中包含了指向驅動程序內部大多數(shù)函數(shù)的指針,描述了虛擬文件系統(tǒng)如何操作一個打開的外圍設備。因而file _operations結構是驅動程序向內核其他部分提供的一個統(tǒng)一的標準設備接口。
file結構是設備驅動程序使用的另一個重要的數(shù)據(jù)結構,指示當前系統(tǒng)中已打開的文件。它在C語言庫中定義,在調用內核open函數(shù)時創(chuàng)建,并傳遞給在該設備上進行操作的所有函數(shù),直到最后的close函數(shù)。file結構中還包含了指向它所擁有的file_operations結構的指針。
inode結構由內核自動生成,代表已打開文件的描述符,與每個打開的文件一一對應。它包含了兩個重要的結構成員:dev_t擴展到32位,其中12位主設備號,20位從設備號,而cdev用于存儲一個指向字符設備文件的指針。
3.2 驅動程序與內核和外部設備間的關系
(1) 通過Linux提供的系統(tǒng)調用函數(shù)(例如init_module等)進入內核,這些函數(shù)在2.6內核版本下總共有兩百多個,提供了幾乎所有應用程序進入內核所需要執(zhí)行的操作。
(2) 系統(tǒng)的內核函數(shù)都有“sys_”前綴(例如函數(shù)sys_init_module),應用程序通過訪問設備文件系統(tǒng)來調用這些函數(shù)。這一層主要是“devfs”(device filesystem)文件管理機制,它是從普通文件和設備文件抽象出來的一個文件系統(tǒng)層,完成進入具體的設備文件操作之前的準備工作。
(3) 由設備驅動程序提供具體的函數(shù),來完成對硬件設備的各種操作。特別的對于PCI9656來說,就是通過PCI接口對設備的寄存器和存儲器進行訪問操作,例如調用register_chrdev等函數(shù)來初始化芯片內部的狀態(tài)寄存器和配置寄存器。
3.3 PCI9656芯片的操作流程
PCI總線是目前最常用的外設總線之一,Linux的PCI內核代碼為PCI設備驅動程序的開發(fā)提供了強大的支持。PCI9656的驅動程序主要包括以下幾個方面:設備初始化,為PCI芯片分配內存資源,實現(xiàn)數(shù)據(jù)的讀寫功能,中斷處理,系統(tǒng)收回內存資源,關閉設備等。
4.Linux2.6內核下內存和中斷管理的研究
2.6內核應用了許多新技術來實現(xiàn)對各類外部設備驅動程序的更好支持。下面結合PCI9656驅動程序中的內存和中斷管理,進一步分析和研究2.6內核對內存和中斷進行的改進和優(yōu)化。
4.1 內存管理
在Linux內存管理器中,頁表保持對進程使用的內存物理頁的追蹤,它將虛擬頁映射到物理頁上。系統(tǒng)必須找到映射到該頁的每一個進程,將使用較少的頁置換出去,這樣進程中相應頁的頁表條目才能被更新。隨著在系統(tǒng)中運行的進程數(shù)量的增加,將這些頁置換出去的工作量也會急劇增加。