前言:一篇好文章的誕生,需要你不斷地搜集資料、整理思路,本站小編為你收集了豐富的驅動程序設計主題范文,僅供參考,歡迎閱讀并收藏。
關鍵詞:CPCI 422;驅動設計;模塊互換;IVI規范
中圖分類號:TP311.11
0 引 言
可互換虛擬儀器(Interchangeable Virtual Instrument,IVI)驅動程序規范是由IVI基金會在VPP\[1\]基礎上為儀器驅動制定的編程接口規范。它擴展了VPP儀器驅動程序的標準,并增加了儀器的可互換性、仿真和狀態緩存等特點,從而實現不同型號儀器之間的互換,在測試系統硬件組成發生變化時,測試程序代碼可以重用。RS 422總線通常用于串行數據通信,采用平衡的差分數據傳輸方式,最大傳輸速率能達到10 Mb/s,最大傳輸距離為300 m。目前有關422的接口模塊種類很多,為了實現各種型號422模塊的互換,使用IVI標準進行驅動設計是很必要的。
1 IVI驅動程序的結構
IVI驅動程序體系結構主要包括IVI類驅動庫、IVI專用驅動庫、IVI引擎、IVI配置實用程序、IVI配置信息文件。其中,IVI 類驅動器是儀器的功能和屬性集,通過這些功能和屬性集實現對一種儀器類進行控制。它是一組接口函數,并不直接控制儀器工作。目前,已經了示波器、數字萬用表等8類儀器規范\[2\]。IVI專用驅動庫封裝了用于控制某一種儀器所需要的信息,能夠直接與儀器硬件通信。IVI 引擎主要完成狀態緩存、儀器屬性跟蹤、類驅動器到專用驅動器的映像功能,是實現 IVI 儀器驅動程序完成狀態緩存和其他增強性能的關鍵支持庫。IVI 配置實用程序用于配置儀器無關測試系統,創建和配置 IVI邏輯名稱,在測試程序中通過傳送邏輯名稱將操作映像到具體儀器驅動程序。具體IVI體系層次結構如圖1所示\[3\]。
[HT5”K][JZ]圖1 IVI體系結構[HT5]
目前,國內外只有NI公司,比較系統地提出了實現儀器互換的體系結構。該公司已經實現了8類儀器的IVI驅動開發,而且也提供一個名為“MAX”的IVI配置程序,用于配置儀器無關測試系統。同時也提供了一個專用驅動庫開發向導,用以開發專用驅動\[4\]。但該向導不能對已有驅動程序進行升級和IVI標準封裝,NI公司也沒有提供類驅動庫的開發向導,加上類驅動庫數量的局限性,導致部分模塊無法用NI公司提供的開發向導進行IVI驅動設計,比如文中所涉及的CPCI 422基于IVI標準的驅動開發\[5\]。
2 CPCI 422驅動開發
在此,以自研CPCI 422模塊為例,介紹422驅動程序開發過程。CPCI 422模塊具有CPCI總線接口,能通過422總線發送數據,并且能接收被測設備通過422總線傳來的數據,并把數據傳送給上位機進行處理。該模塊具有8個通道,每個通道均能實現接收或者發送功能,通道能夠單獨工作也可一起工作,并且能對數據傳輸參數進行設置。
針對IVI體系結構,首先設計422類驅動函數庫。然后在類驅動函數庫基礎上開發專用驅動函數庫,驅動函數最后以.dll形式存在,采用 LabWindows/CVI,Visual Basic和 Visual C++等開發環境均可以開發。同時設計具備IVI引擎功能函數或者程序。對于IVI 配置信息文件可以通過專門的IVI配置實用軟件(如NI公司提供的MAX)或者其他文本編輯器進行編輯。
基于IVI標準的驅動程序配置引擎是整個IVI體系中的核心支柱。其主要功能就是實現類驅動庫到專用驅動庫的映射,使應用程序在調用類驅動庫時能自動加載相應配置的專用驅動庫。
該設計中,IVI配置引擎設計的主要思路是通過讀取配置信息文件,由配置文件中所設置的模塊邏輯名找到對應的專用驅動庫信息字段。此字段主要包括專用驅動庫路徑文件名、專用驅動庫函數前綴等,然后通過這些一一對應的映射關系,自動加載專用驅動庫。其工作流程如圖2所示。
該設計運用函數ivi422Class_SpecificDriver實現自動加載功能。下面為具體的函數設計:
該函數核心是以代表專用驅動庫文件名稱為形式參數,調用LoadLibrary( )函數加載專用驅動庫。應用程序只需通過類驅動庫及模塊的配置信息作為參數,調用ivi422Class_SpecificDrive()函數,即可實現專用驅動庫的自動加載。根據上面介紹可知,讀取配置文件以及根據配置文件自動加載專用驅動庫,即可實現配置引擎的功能。
類驅動庫是IVI體系的外觀框架,用來控制一個特定類型儀器的一系列功能和屬性。它是一組編程接口,而不對儀器進行直接操作。該設計中,為了實現422模塊的正常通信,作為連接虛擬儀器硬件和應用測試程序的紐帶,將422類驅動函數規劃如表1所示。序號函數功能描述
1Init打開并初始化儀器
2Close關閉儀器
3SerialRead開始接收數據
4SetClock設置每個通道波特率模式
5SetUART通道工作參數設置
6SetDivisor通道具體波特率設置
7ChannelControl設置每個通道的工作狀態
8SerialWriteData開始發送數據
9SpecificDriver動態加載專用驅動庫[HJ0][HJ][HT5SS]
根據IVI規范,類驅動函數由函數名前綴加具體函數名構成。在參數設置上均采用VISA數據類型。在該設計中,類驅動函數均采用ivi422Class作為函數前綴名?,F舉例如下:
該函數的功能是提供儀器初始化函數接口,其中返回值定義為ViStatus型,具體表示形式,參照IVI標準,如IVI_SUCCESS。參數為ViSession型指針,用來返回儀器資源句柄。
根據前面介紹可知,類驅動函數只提供接口功能,不涉及具體儀器操作,現仍以初始化函數為例,介紹類驅動函數如何實現接口功能。其具體實現如下:
該函數的核心部分就是調用GetProcAddress(hDLL,FuncName)函數,獲取專用驅動庫函數對應函數地址。其中,hDLL為在配置引擎功能中調用ivi422Class_SpecificDriver()函數獲取的專用驅動庫句柄,FuncName為對應函數名稱。
對于專用驅動動態鏈接庫的開發,該設計未借助Labwindows/CVI中的專用驅動開發向導,而是直接在VC中進行編制。專用驅動庫函數的主體函數名和參數類型與類驅動是完全一致的,否則類驅動和專用驅動之間的參數傳遞會出錯\[8\]。為了與類驅動前綴名相區別,在該設計中,專用驅動函數前綴名一律為ivi422。舉例如下:
函數則具體針對儀器操作,完成模塊初始化功能。
對于上層應用程序,專用驅動函數隱藏了具體硬件工作細節,只以函數的形式提供了完成一項具體功能的接口。上層應用程序只需要通過類驅動庫間接調用專用驅動庫提供的函數,即可完成對硬件的操作控制。規劃表中已經列出了422操控的基本函數,如果需要再增加函數,只需要在類驅動的專用驅動中同時增加,便能實現功能擴展。
[BT3]2.3 CPCI 422模塊IVI驅動程序中配置文件編輯
對于IVI 配置信息文件,可以通過專門的IVI配置實用軟件(如NI公司提供的MAX)進行編輯。在該設計中,利用圖形化編程軟件自己設計以對話框為基礎的配置實用程序,通過此程序對配置文件進行編輯。圖3為此程序的主界面。
通過此程序,修改配置文件中的邏輯名字段、描述字段、驅動庫加載路徑字段,以及驅動函數前綴字段、仿真調試字段。然后通過配置引擎對于配置文件的讀操作,建立類驅動庫和專用驅動庫的正確映射。當改變模塊時,只需要改變模塊的邏輯名,以及模塊專用驅動庫的加載路徑和前綴,而不需要修改類驅動庫,也不會影響上層應用程序,從而實現了儀器的互換特性。
2.4 應用程序調用驅動工作流程
首先,應用程序通過一個邏輯名調用 IVI 類驅動庫,配置引擎,將該邏輯名與配置文件中的所有邏輯名進行匹配,得到實際的 IVI專用驅動庫指針,并實現該驅動器的動態加載;然后將 IVI 類驅動器中的函數和屬性與IVI 類專用驅動器的對應函數和屬性進行鏈接,使應用程序可以間接地訪問這些函數和屬性。在編制應用程序時,應同時包含類驅動庫的動態鏈接庫和頭文件,編制過程中,對開發人員只需調用類驅動函數。┩4為應用IVI體系基于422模塊的應用程序調用驅動工作流程。
通信卡的硬件設計
1 通信卡的主要特點
通信卡的硬件設計目的是智能化通信:在卡上具有4個DMA通道及相應的數據緩沖存儲區。在數據的接收過程中,通信卡會自動接收幀數據,判別幀長度,在幀尾將接收到的幀數據提交系統。在發送數據過程中,系統只須把發送的數據提交給本卡,具體的發送過程由該卡自行完成,不因多路通信而使主機增加開銷。該卡有內/外時鐘兩種工作方式,近距離可省去調制解調器,波特率為600b/s-64Kb/s,提供2路符合RS-232/CCITT V.24和RS-422A標準的接口信號。
2 通信卡的電路設計
通信卡組成框圖如圖1所示。其主要由DMA控制器、總線競爭仲裁器、串行通信控制器、數據緩沖存儲器SRAM、存儲器I/O映像和物理地址產生器、總線接口及防護、波特率產生器、接口電路等單元電路組成。
DMA控制器作為通信卡的主設備,控制卡上的數據接收和發送(來自通信控制器和CPU),并負責仲裁優先權。由于在進行數據通信時,允許主機CPU訪問本卡SRAM,且主機對其中某一路發控制命令時,不影響其余三路通信,這樣將會使主機CPU與本卡DMA競爭本卡總線控制權。而總線上沒有給出主機CPU指令排隊狀態序列,故不能直接設計多主競爭,因而在本卡總線上用門陣列設計了一個狀態機,不斷地監視總線爭用情況,完成本卡總線競爭、仲裁功能。完成HDLC規程的串行通信的器件是INTEL 8274多規程串行控制器,它能完成2個獨立的串行接收/發送全雙工通信。為了使4個信道在一幀數據的發送或接收過程中,主機不干預,故將發送的一幀數據在發送開始前由CPU用批命令放入卡上的SRAM中,同樣,在接收過程中,卡上DMA將接收到的數據放入SRAM中,等一幀接收完成后,再用批命令取出,放入系統存儲器中。卡上SRAM不占用主機內存地址,采用I/O映像,該適配器插入主機之后,主機通過系統I/O地址對其訪問,這由地址產生器完成??偩€接口包括數據收發器,數據開關電路,讀、寫及中斷等控制電路,地址譯碼等。波特率產生器提供了一個可編程的時鐘信號發生器,用戶可自行設置通信速率,供工作于內時鐘方式時使用。接口電路提供符合RS-232/C CITT V.24和RS-422A標準的接口信號。
3 通信流程設計
如果要發送一幀數據,CPU用批命令將數據放到本卡SRAM中,然后設置相應的發送DMA通道。DMA通道是非自動重裝方式,啟動8274控制器發送,然后CPU就不需要管理,由卡上硬件自動發送。
如果需要接收數據,啟動接收通道。接收通路自動搜索輸入信號,搜索到數據幀時,由卡上DMA控制器來管理,將接收的數據放人本卡SRAM中,并向CPU請求中斷,讀出數據。
4 總線競爭設計
由于同時可進行四路通信,且CPU可隨時對某一路發控制命令或訪問卡上SRAM存儲器,就將出現CPU與本卡主設備DMA爭用本卡總線的狀況。由于ISA總線沒能給出CPU指令排隊狀態序列,這給總線仲裁帶來了困難,而本卡的總線競爭、仲裁是由可編程邏輯器件設計的狀態機來完成的。狀態機使用一個4MHz信號作為時鐘,共設3種狀態:
①CPU控制狀態。
②DMA控制狀態。
③空閑狀態,CPU及DMA均未能得到控制權。
當狀態機檢測到無CPU及DMA申請總線使用權時,就進入空閑狀態,而一旦CPU或DMA請求總線,狀態機立即將總線使用權交給CPU或DMA。如果正在CPU控制狀態期間,DMA申請總線使用權,狀態機仍然判定CPU控制總線,讓DMA處于等待,直到檢測CPU指令完成,狀態機才轉為DMA控制狀態。如果在DMA控制狀態時,CPU申請總線使用權,狀態機仍然判定DMA控制總線,讓CPU處于等待,直至DMA字節傳送完,狀態機轉為CPU控制狀態。CPU及DMA對總線的使用權是單個指令或字節傳送,不設置總線封鎖,因而CPU、DMA可頻繁交換使用權,不會出現等待時間過長的現象。
通信卡的驅動程序設計
1 設備驅動程序的I/O模型
通信卡的驅動程序是利用Windows XP的DDK軟件開發的標準的核心態設備驅動程序。它使用統一的“文件”形式,用戶可以通過代表通信卡設備的文件名,在WIN32子系統中用文件操作函數來訪問。該設備驅動和程序可以根據用戶的需要,設置為自動加載,或手動加載,也可以動態的加載該驅動程序。通信卡的驅動程序設計成為支持同步I/O模型,也可以為異步I/O模型。
2 發送數據I/O例程設計
在用戶態提交發送任務到核心態,由I/O管理程序負責調用驅動程序,驅動程序發送IRP交給硬件,假若當前發送器不忙,則具體的發送操作全部由發送器自行完成,而驅動程序則返回已經一個本幀可以發送的標志。具體的發送完成結果則可以在發送任務完成后查詢得到。可是,如果程序向當前設備發送器提交發送任務時,該發送器正在處理上一幀,那么則有兩種方法處理。
①立即方式:立即返回一個錯誤,當前設備忙,不能發送。
②阻塞方式:I/O管理器程序會調度相應的異步處理例程,將當前的發送任務放進任務隊列中,返回一個標志:I/O掛起,當前設備忙,發送任務提交任務隊列。驅動程序會在發送器空閑時,提交任務隊列中的發送任務給發送器。完成發送任務后,將相關文件句柄設為有信號狀態,通知本次發送任務完成。
3 接收數據I/O例程
接收數據例程采用客戶/服務器的模式設計。由于用戶的接收請求和硬件的接收并不是同步的,所以在設計中,為避免丟失數據,考慮創造一個專門的接收線程。這樣,同步用戶請求、接收線程、硬件層之間的通信就必須仔細地設計。圖2示意了用戶態接收請求、接收線程以及硬件層之間的通信同步。
①硬件層與接收線程之間通信
硬件層與接收線程之間通信的同步是通過同步事件對象來實現的。同步事件對象通常處于無信號狀態,只有當成功地接收到一幀時,才將該事件置為有信號狀態。接收線長久等待同步事件對象,在沒有收到數據時,因同步事件對象處于無信號狀態而阻塞。當硬件檢測到數據時,實時中斷服務程序負責將同步事件對象置為有信號狀態,接收線程就會釋放阻塞。將通信卡SRAM上的接收數據讀進接收線程緩沖區隊列,然后將同步事件對象置為無信號狀態,接收線程再次阻塞,等待接收下一幀數據。
②用戶層和接收線程之間的通信
當用戶提交接收任務時,由驅動程序的調度程序讀取接收線程的緩沖區隊列,并將標志置為“空”,同時將緩沖隊列事件置為無信號狀態,并返回,如果緩沖區是空,則
?立即方式:立即返回無數據。
?阻塞方式:阻塞直到有數據隊列進入。接收隊列的每個緩沖區都對應一個通知事件,如果接收線程將SRAM中的數據讀進隊列,就將相應的通知事件置為有信號狀態,用戶請求就等待該通知事件,只要有數據在隊列中,就讀取返回,否則被阻塞。
4 硬中斷服務程序設計
通信卡在全雙工的通信中具有實時性,而且在較高的波特率,硬中斷非常多。為了防止高優先級中斷過多地搶占CPU時間,設計中采用了實時中斷服務程序和延遲過程調用的方法。
在Windows XP系統中,每個內核函數和過程都運行于特定的優先級。較高優先級的函數或事件可以搶占較低優先級,反之則不然。實時中斷服務程序ISR運行于DIRQL級,具有較高的優先級,它只能被更高級的硬中斷所搶占,不會對同級或較低優先級的硬中斷的響應。所以,在實時中斷服務程序中,只做盡量少的必須工作,即讀出中斷向量,而將大量的數據傳送及處理等工作交給延遲過程DPC去完成。因為DPC過程運行于DISPATCH_LEVEL級,是相對較低的優先級,它可以被任何級的硬中斷所搶占。這樣,既保證了硬中斷的及時響應,又提高了程序的性能。
5 驅動程序人口例程
Windows XP為每個核心態的驅動程序提供了一個默認的標準入口點DriverEntry()。設計中,考慮到該例程運行于PASSIVE_LEVE級,系統只運行該例程一次就拋棄了,所以在驅動程序中用到的重要數據、對象等都不能保存在DriverEntry()例程中,必須在初始化過程中分配一塊NoPaged內存來保存。通信卡的驅動程序的DriverEntry()例程主要完成如下功能。
讀取Registry的硬件配置信息,聲明I/O地址、中斷等資源;創建代表通信卡的設備名MPSC,該名字對WIN32子系統是可見的;設置調度例程入口點;分配一塊NoPaged的內存,存儲重要信息;連接硬中斷,設置中斷服務程序,初始化線程、事件、信號燈、DPC等內核對象,返回狀態STATUS_SUCCESS。
如果在以上過程中遇到錯誤,則需要做以下工作:斷開硬中斷;釋放硬件資源;將相關的錯誤信息打包,并記錄;返回錯誤信息。
6 設計驅動程序中需要注意的問題
由于通信卡在應用中具有一定的實時性,為了克服中斷的不確定性。提高系統的性能,開發了Windows XP系統所有驅動程序中最難的異步驅動程序。在系統的內核開發,異步模型I/O操作中,內核對象的同步十分復雜,細微的差錯都會導致系統徹底崩潰。在設計驅動程序中需要注意以下問題。
?在程序中用到的內核對象:事件、信號燈、線程以及連鎖等,都必須將其存儲在Nopaged內存中,否則,會造成系統崩潰。
關鍵詞:嵌入式;CF卡;低層驅動;存儲設備
中圖分類號:TB文獻標識碼:A 文章編號:1672-3198(2012)12-0162-01
0 引言
設備驅動程序是構成Linux內核的主要部分,不合理的驅動設計會導致系統內核出現紊亂,由于不穩定而導致系統崩潰,使行成重要數據丟失或嚴重后果。因此,設計合理的驅動程序,有助于保障系統的整體穩定性。在S3C2410開發板下設計合理的驅動程序是本文研究的重點。
S3C2410的硬件平臺是基于ARM公司的ARM920T處理器核,采用32位微控制器,價格低,功耗低,性能高;軟件平臺通過u-boot移植和內核編譯完成,所有這些特性使S3C2410為 linux操作系統內核驅動程序設計提供了較好的解決方案。
目前,嵌入式系統中應用最廣泛的存儲卡是CF卡。多數情況下,使用PCMCIA控制器實現CF卡的操作,為了減少設備使用和成本降低,本文在沒有PCMCIA控制器情況下,探討分析設備驅動程序設計步驟,CF卡的配置及底層驅動如何工作等問題,研究實現了利用CF卡作為存儲設備的嵌入式Linux系統。
1 系統設計
嵌入式系統使用CF卡作為存儲設備的設計目前有很多,而開發設備的選型不同,開發的方法不同,本系統使用Linux操作系統,以S3C2410為開發平臺,以ARM920T處理器為模板來實現CF卡的嵌入式系統。
驅動程序開發首先需對Linux操作系統中原有的IDE程序進行改造,用后臺程序管理CF卡的熱插拔事務,同時CF卡以Memory尋址訪問方式進行8位尋址。在對Linux設備進行驅動程序設計時,具體設計步驟如下:
(1)啟動系統,將設備登記到相應的設備數組,并返回設備的主驅動號。利用設備號對此數組進行索引。調用設備注冊函數module_register_chrdev()進行設備注冊。
(2)為驅動函數定義功能函數,當系統調用這些功能函數時,系統將自動運行函數定的模塊實現特有的功能。
(3)當一個模塊使用完成時,啟動動態的卸載模塊函數,調用cleanup_module()函數,并調用設備注銷函數即可卸載函數。
在進行設計時,需注意Linux設備驅動程序接口和幾個重要的數據結構。具體有以下四層接口:應用進程與內核、內核與文件、文件系統與設備驅動程序、設備驅動程序與硬件設備。
每個驅動程序都有一個數據結構,包含的函數指針指向所開發的接口,內核用主設備號作為索引訪問數據結構。
2 接口和重要的數據結構
設備驅動程序是操作系統硬件設備和內核的接口,Linux 操作系統中,Linux 操作系統采用統一的接口,在硬件設備、設備驅動程序、文件系統、內核、應用程序進程間有相連的接口。
驅動程序有一個file_operations的數據結構,該數據結構提供了很多接口,其中常用的接口有open、read、write、seek、release等,為驅動程序開發提供了保障。驅動程序中struct inode數據結構為設備和文件對應了唯一的inode號,驅動程序中同時也使用了struct file、struct device 數據結構。
3 CF卡基本配置
CF卡在存儲操作前,對CF卡進行的相關配置主要有以下幾個方面:配置GPIO并分配尋址端口,用于傳輸CF卡信號。配置CF卡的屬性存儲空間和尋址訪問方式。在系統中CF卡使用Memory尋址訪問方式,將屬性寄存器配置為0x00,其他屬性寄存器保持默認值。驗證對屬性寄存器的值,當驅動屬性值與默認值不匹配時,則說明Memory尋址訪問方式沒有正確使用CF卡,此時需修改屬性值為默認值即可。
4 CF卡驅動程序設計
4.1 底層驅動實現
CF卡存儲備份需要通過CF卡的底層驅動實現,這就要求CF卡能準確的接收及響應系統對它的I/0請求。具體流程如下:
(1)在讀寫命令時,使用LBA尋址模式來訪問CF卡。當驅動對CF卡的I/O請求進行正確接收后,此時把相關參數值和ATA命令值寫入對應的寄存器,并向CF卡ATA命令,即完成了ATA命令。
(2)填寫ATA命令控制塊后,CF卡可以利用輪詢的方法對發送的命令做出響應。
(3)受外部環境影響造成CF卡沒有接收到命令或者接收命令出錯時,可以使用軟重置將其恢復到初始狀態,并重新發送該ATA命令。
快捷的實現存儲備份需使CF卡能及時響應熱插拔,把CF卡設定為TureIDE工作模式,這樣CF卡就可以隨意移動。在系統層注冊字符型設備CFMGR文件實現探測熱插拔事件、與應用層通信,實現分配或釋放系統資源,從而驅動CF卡;在應用層及時監聽熱插拔事件并采用Select阻塞機制,達到盡量少的占用CPU資源。
4.2 驅動程序實現
驅動程序的作用在于為應用程序提供機制,它是內核的一部分。該驅動程序實現了設備初始化,在內核和設備間相互傳送數據,讀取、回送數據,檢測錯誤等功能,開發的難點在于高效請求處理、中斷、1/O操作等方面功能設計。
5 結語
本文通過系統驅動程序的設計流程分析,研究程序開發的接口和數據結構,對CF卡進行配置,研究開發驅動程序,實現了CF卡存儲備份和快速熱插拔,使其便于在其他系統中應用。
參考文獻
[1]嵌入式Linux 中CF卡的管理研究[EB/OL].140.112.99.135/ntu/showthread.php?threadid=67.
windows nt是一個功能全面的操作系統,具有完全集成式的連網能力,它的網絡模型開始于mac子層,網絡接口卡(network interface card以后簡稱網卡或nic)驅動程序駐留在其中。通過相關的網卡把windows nt與網絡連接起來,但一直到80年代后期,許多傳輸協議的實現受限于mac層接口的獨特實現,因為mac層定義了協議與網卡之間的轉換機制。
1989年,microsoft和3com兩公司提出了一個定義mac層與osi模型高層協議驅動程序之間的網絡設備接口規范(network device interface specification : ndis),ndis給數據交換提出了一個靈活的環境,它規范了軟件接口──稱為ndis接口,傳輸協議可用它與網卡驅動程序進行通信。因此在windows nt環境下開發核心態網卡驅動程序應遵循ndis規范。
對于高速網絡fddi(fiber distributed data interface)網卡驅動程序還需要smt(station management)站管理功能的實現,否則將不能作為一個fddi站連入環結構中,只能實現點到點間的數據通信。故有必要將smt軟件移植到網卡驅動程序中,這將又導致對miniport nic驅動程序編程框架的破壞,于是有必要形成fddi網卡驅動程序(包含smt)與windows nt操作系統的良好接口──由邏輯網卡的注冊和mac層驅動程序的初始化來完成。
所以,本課題旨在深入研究應用microsoft公司的ddk(device driver kit)將smt移植于windows nt的fddi網卡驅動程序過程中如何注冊miniport nic驅動程序。即怎樣正確注冊邏輯網卡和mac驅動程序的初始化。著重討論與初始化相關的上邊緣函數的使用和調用關系以及初始化過程中遇到的各種問題的具體解決。
第一章windows nt環境下fddi網卡驅動程序
總體結構介紹
第一節windows nt網絡結構
§1.1.1 windows nt網絡體系結構
windows nt的網絡體系結構是基于國際標準化(iso)制定的標準模型──開放式系統互連(open system interconnection:osi)參考模型分層建立的,這種方式有利于隨時擴展其它功能和服務。
windows nt網絡模型開始于mac子層,網卡驅動程序就駐留在其中。它通過相關的網卡把windows nt與網絡連接起來,圖中的多個網卡表明在一臺運行windows nt的計算機上能使用多種網卡。
這一網絡體系結構包括兩個重要接口──ndis接口與傳輸驅動
程序接口(tdi)。這兩個接口把兩個層隔離開來,辦法是相鄰的部件只允許按單一的標準來寫,不允許多重標準。例如一個網卡驅動程序(在ndis接口的下面)就不需要特地按每個傳輸協議來寫它的代碼塊,恰恰相反,該驅動程序是寫給ndis接口的,它通過符合ndis的相應傳輸協議來請求服務。這些接口包含在windows nt的網絡體系結構中,以容納可移植、可互換的模塊。
在兩個接口之間,是傳輸協議。它在網絡中起著組織者的作用。一個傳輸協議規定了數據以何種方式呈遞給下一個接收層,以及如何對數據相應地進行打包。它通過ndis把數據傳給網卡驅動程序,并通過tdi把數據傳給轉發程序(redirector)
tdi之上是轉發程序,它把本地的網絡資源申請轉送給網絡。
為了能和其他廠商的網絡互連,windows nt允許有多個轉發程序。對于每一個轉發程序windows nt計算機必須也有一個相應的供應者(provider)(由網絡廠商提供)。多供應者路由選擇程序決定適當的供應者,然后借助于供應者,對應用請求到相應的轉發程序做出選擇。
§1.1.2 windows nt網絡驅動程序
windows nt支持兩種類型的網絡驅動程序
傳輸驅動程序
實現數據鏈路層中的邏輯鏈路控制子層協議和傳輸層協議。向 下與ndis接口,向上與tdi接口。
網卡驅動程序
實現對物理層的管理和數據鏈路層中介質訪問控制子層協議,通過ndis向下管理物理網卡,向上與傳輸驅動程序通信。
§1.1.3 windows nt網卡驅動程序
windows nt環境下的網卡驅動程序也分為兩種:
miniport網卡驅動程序:miniport驅動程序只須實現與網絡硬件相關的操作(包括發送和接收)。而所有底層網卡驅動程序的通用操作(如同步),一般由ndis接口程序來實現。
full網卡驅動程序:full網卡驅動程序必須實現所有硬件相關和同步、排隊等操作。例如full網卡驅動程序為了響應數據接收,需要保持本身的捆綁信息,而miniport就可以由ndis接口庫來實現。
在windows nt的早期版本中,full網卡驅動程序要求開發者實現許多底層操作,來處理多處理器的核心問題以及處理器、線程的同步,這樣不同的開發者在大量重復著許多相同的工作。
而miniport網卡驅動程序允許開發者僅僅寫一些與網絡硬件相關的代碼即可,而那些通用的函數由ndis接口庫來實現,這樣開發出來的驅動程序減少了不必要的工作。
第二節miniport驅動程序的結構
ndis接口規范了網卡驅動程序的實現,同時也對tdi驅動程序的實現提出了一定的要求,在nt中,ndis約束下的網卡驅動程序、tdi驅動程序和系統的關系如下圖所示:
圖2.0 ndis約束下的網卡驅動程序、tdi驅動程序和系統的關系
miniport驅動程序包括驅動程序對象、驅動程序源代碼和ndis接口庫代碼。windows nt ddk提供ndis.h作為miniport驅動程序的主要頭文件,定義了miniport驅動程序的入口點、ndis接口庫函數和通用數據結構。
上邊緣函數的作用是網卡驅動與ndis接口庫進行通信,而下邊緣函數是tdi協議驅動程序與ndis通信的手段。
§1.2.1 miniport網卡對象
ndis用一個叫做邏輯網卡的軟件對象來描述系統中的每塊網卡,而邏輯網卡與windows nt設備對象的通信由i/o子系統來管理,描述網卡的設備對象包括相關的網絡信息如名字、網絡地址和網卡內存基地址等,它還包含與硬件相關的驅動程序狀態數據(捆綁數目,捆綁句柄,包過濾數據庫等)。ndis分配一個句柄到miniportinitialize這個上邊緣函數的一個結構中,然后miniport網卡驅動程序將在以后提供這個句柄來給ndis調用,這個結構一直被ndis保持,并且對miniport驅動程序不透明。
當miniport網卡驅動程序初始化一塊網卡時,它創立自己的內部數據結構來描述網卡,記錄需要它管理的與設備相關的狀態信息。當miniport網卡驅動程序調用ndismsetatttibutes或ndismsetattributesex兩ndis庫函數時,它傳遞一個句柄給這數據結構。這樣,當調用miniport驅動程序入口點時,它就傳遞這個句柄來驗證驅動程序所對應的網卡的正確性。這個數據結構為miniport網卡驅動程序所擁有并維護。
§1.2.2網絡對象標識符
miniport nic驅動程序還需要維護一組對象,這些對象是系統定義的對象標識符(object idetifier:oid)來標識,以描述驅動程序的性能和當前狀態信息。為查詢這些信息,上層驅動程序調用ndisrequest向ndis接口庫指示oid。oid表示了調用所需的信息類型,如miniport驅動程序所支持的lookahead緩沖區大小等。ndis接到上層驅動程序的查詢請求,將oid傳遞給上邊緣函數miniportqueryinformation實現對oid的查詢,如果上層驅動程序請求改變狀態信息則調用miniportsetinformation實現對oid的設置。
§1.2.3 miniport網卡驅動程序代碼
典型的miniport nic驅動程序必須有一些函數來通過ndis接口實現上層驅動程序與硬件的通信。這些函數稱為上邊緣服務函數。
這些上邊緣服務函數由驅動程序的開發者根據驅動程序面向的特定低層網絡類型和硬件以及相應環境,可以有選擇地實現,但必須保證驅動程序最基本的功能,這些基本功能包括初始化、發送、中斷處理、重置、參數查詢與設置和報文接收。
miniportinitialize:操作系統根據系統配置信息,檢測出網卡已安裝時,由ndis接口在初始化時調用,主要完成低層網絡類型確定,對應于物理網卡的邏輯網卡初始化,中斷信息注冊,網卡與主機通訊方式的確認。i/o端口的申請與注冊,內存映像,mib的初始化,物理網卡的驗證與初始化等。
miniportreconfigure:支持網卡參數動態變化,和miniportinitilize一樣由ndis接口以初始化級別調度執行(不能屏蔽中斷,必須由驅動程序承認并清除在此期間產生的中斷),支持即插即用和軟配置的網卡在動態改變參數時,必須提供此函數。
miniportqueryinformation:查詢網卡的狀態以及網卡驅動程序的操作或統計參數,如是否支持組通訊、網卡的物理速率是否支持回環、是否支持直接拷貝等,這些參數以oid方式統一管理。
miniportsetinformation:ndis接口或協議驅動程序通過調用此接口改變驅動程序維護的oid庫,一些操作參數的改變也將同時改變驅動程序狀態,例如組地址的設置。
miniportreset:包括網卡硬件重置和驅動程序軟件重置,軟件重置包括驅動程序狀態重置,以及一些相關的參數重置,還需考慮有些參數的恢復,重置時不必完成所有正在活躍的外部請求,但必須釋放已占用的外部資源。
miniporthalt:掛起網卡并釋放該網卡驅動程序占用的所有資源,在此期間不屏蔽中斷。
miniportisr:高優先級的中斷處理程序,進行的工作包括初始中斷處理類型,決定是否進行中斷轉交,對卡上中斷進行處理 等,該服務類型只在以下情況被調用:
ndis接口調用miniportinitialize和miniporthalt兩函數時。
.中斷處理類型設為每此中斷處理過程都調用時。
為使系統能及時響應所有硬件中斷,高優先級的硬件中斷處理程序應盡可能的減少運行時間,防止長時間的屏蔽低優先級中斷,避免造程中斷丟失。
miniporthandleinterrupt:由中斷延時處理程序在中斷延時處理時進行調用。ndis排隊所有的延時處理,該服務主要處理發送完成、報文接收、描述符用盡、溢出、網卡異常等中斷。
miniportsend:ndis收到上層發送請求時經過若干協議處理再向下調用此服務過程,發送的packet已含有llc和mac頭,該服務過程進行邊界對齊、packet約束重整、描述符映射和報文發送、以及發送資源和packet緩沖隊列管理。
miniporttransferdata:多個已和網卡捆綁的協議驅動程序在接收到報文到達指示后,向網卡驅動程序發出傳送請求以拷貝各自所需的報文數據部分,網卡驅動程序根據各協議驅動程序對單個packet是否進行多次拷貝,以決定是否暫存只允許單次拷貝的packet等。
miniportcheckhandle:ndis每秒調用此服務函數一次,驅動程序發現網卡異常時報告給ndis由ndis調用miniportreset進行硬件重恢復。
miniportenableintrrupt:中斷使能。
miniportdisableinterrupt:中斷屏蔽。
另外,每個網卡驅動程序必須有一個初始化入口點,由driver entry函數實現,它和系統相關,由操作系統在裝入驅動程序時調用,主要完成初始化ndis wrapper,再由wrapper初始生成驅動程序管理塊并完成相應各種初始化工作,登錄網卡驅動程序所有上邊緣服務入口點,同時寫入ndis版本信息。
§1.2.4 ndis接口庫
ndis接口庫包括在ndis.sys中,它是一個核態函數庫,有一套抽象的函數,無論協議驅動程序還是nic驅動程序都連接到這個庫中,以實現上下層之間的操作。
第二章fddi網卡驅動程序的加載和運行
第一節 網卡驅動程序的安裝
windows nt網卡驅動程序安裝的目的是實現網卡相應硬件信息和驅動程序在windows nt注冊庫中的注冊,使windows nt能夠正確識別網卡,了解所必需的軟硬件信息并能在windows nt啟動時加載相應驅動程序。
網卡驅動程序安裝時,首先在主群組的控制面板中選擇“網絡”,然后添加網卡,指定相應信息文件──oemsetup.inf的路徑,以完成以下兩個必要的操作:
復制驅動程序到相應的系統目錄(windows nt根目錄\system32\drivers\)中;
在windows nt注冊庫中存入相應軟硬件信息。
下面主要以fddi網卡為例介紹安裝驅動程序所必需的工作:
§2.1.1網卡一般硬件參數
對于fddi網卡,必須在編寫其oemsetup.inf文件時確定以下硬件參數:
總線類型:pci(5)……括號中的數字5表示pci總線在ndis中的總線類型代碼;
廠商代號:0x5588……系統加載時確定網卡的標記,也是編程時確定pci槽號的標識;
cfid: 0x01;
介質類型:光纖(3) ……括號中的數字表示光纖在ndis中的介質類型代碼;
是否支持全雙工:支持。
對于其它的硬件信息在此inf配置信息文件中可有可無,如若配置,則可在驅動程序的編寫時利用這些信息,方便編程,同時有利于其它應用對其參數的確定和使用。
§2.1.2 fddi網卡加載時需在注冊庫登錄表里做的網絡配置
網卡驅動程序的安裝通常將創建登錄表中的四個不同子鍵:
software registrion鍵,對應于驅動程序,存在于hkey_local_machine\software\company\ productname\version中。我們的fddi網卡驅動程序所對應的是hkey_local_machine\software\net612\yhfddi\yhfddi1.0;
網卡的軟件登錄鍵,存在于hkey_local_machine\software\microsoft\ windows nt\nt3.51\networkcards\yhfddi1;
驅動程序的服務登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services
網卡的服務登錄鍵,存在于hkey_local_machine\system\currentcontrolset\services
對于每一個網絡部件,一個名為netrules的特殊子鍵在鄰近的驅動程序或網卡登錄子鍵里創建,netrules標識網絡部件為網絡整體的一部分。
fddi網卡驅動程序對應的標準軟件登錄表項將出現在以下路徑:
hkey_local_machine\software\net612\yhfddi\yhfddi1.0;
驅動程序對應的標準項的值為:
description =yhfddi/pci adapter controller
install date =……
……
refcount =0x01
servicename =yhfddi
softwaretype =driver
title =yhfddi/pci adapter controller
而且在yhfddi驅動程序相關的netrules子鍵下,這些值項為:
bindable =yhfddi driver yhfddi adapter non exclusiver
bindform =“yhfddisys”yes no container
class = reg_multi_sz “yhfddi driver basic”
infname =oemnad1.inf
type =yhfddisys ndisdriver yhfddidriver
use =driver
yhfddi網卡在如下路徑的networkcards子鍵里介紹:
hkey_local_machine\software\microsoft\
windows nt\nt3.51\networkcards\yhfddi1;
網卡的標準項包括以下這些值:
description =yhfddi/pci adapter controller
install date =……
manufacturer =net612
productname =yhfddi
servicename =yhfddi01
title =[01]yhfddi/pci adapter controller
§2.1.3編寫inf信息配置文件
gui inf描述語言被windows nt用以書寫系統所有部件的配置文件,當然也可以用以書寫網絡系統各部件的配置文件,該配置文件描述了網絡部件安裝、配置、刪除的執行過程。當網絡部件進行初始安裝或二次安裝(通常通過ncpa進行)時,安裝程序讀取部件對應的配置文件,進行解釋執行。gui inf描述語言由節、命令、邏輯操作、變量規范、流程控制以及一套調用dll或外部程序的機制組成,其中,節是配置文件的主體,節可分為install節(類似于函數),shell節(也類似于函數,但可調用insall和shell節),detect節(不包含命令),一個配置文件一般由若干不同類型的節組成。驅動程序的開發者根據需要可以在配置文件中編寫相應代碼,使得用戶和系統之間能進行交互,并且由用戶決定一些配置參數。
nt網卡配置文件有其一套規范,驅動程序開發者必須按規范編寫配置文件,一般來說,一個配置文件至少應該提供下面三個節:
安裝入口點:[identify]shell節。該節主要功能是給出安裝部件的類型名,系統通過它識別該部件屬于哪一大類(display,mouse,scsi,network等)中的哪一類(網絡adapter,driver,transport,service,network和netprovidor),同時,還需要給出映像文件和配置文件所在的源介質及標識。
[returnoption]shell節。系統執行安裝identify節后,執行該節。它主要功能是檢查所需安裝的部件是否支持的硬件平臺和語言,并給出網卡名(有些配置文件支持多類網卡,此時必須讓用戶進行選擇,并獲得選擇結果)。
[installoption]shell節。該節是配置文件得主體,也是上次安裝完后再次進行配置、刪除、更新的入口點。主要功能是拷貝映像文件和配置文件,生成配置的各種選項,創建該部件在注冊庫中對應的各種登錄子樹并更新重寫。
第二節 驅動程序的加載過程
§2.2.1 windows nt的啟動過程
關鍵詞:WDMDriver;Windows;例程;DLL
中圖分類號:TP316文獻標識碼:A文章編號:1009-3044(2009)33-9557-02
Study about WDM-based I/O Device Driver
SUN Hu-jun
(Department of Computer Engineering, Xi'an Aerotechnical College, Xi'an 710077, China)
Abstract: This article describes the characteristics and structure of the WDM; Describes I/O device driver a basic component;Discusses the DLL in the practical application significance.
Key words: WDMDriver; Windows; distance; DLL
在計算機應用系統和控制系統的開發過程中,通常需要在Windows 環境下,直接訪問和控制具有特定功能的硬件設備。由于操作系統版本不同,其運行機制必然存在差異。在這里針對驅動程序的運行機制主要分為兩類。一類是以前的Dos 和Windows98系統,在這類環境下可以直接完成對I/O 端口的讀寫;另一類是NT4.0以上版本Windows系統,在這類環境下,為了使系統變得更為安全,Windows對系統底層操作采取了屏蔽策略,不允許用戶態的應用程序直接訪問I/O端口,而是通過編寫驅動程序,這樣可以使用Kernel層設備驅動程序提供的各種服務間接地訪問I/O,因此編寫I/O設備驅動程序極為重要。
為了解決I/O設備驅動程序和不同結構操作系統的兼容性[3],微軟公司在 1997年提出了一種全新的Windows 驅動程序模式(WDM),支持即插即用、電源管理和WMI技術,為存在于Windows 9x 和Windows 2000 操作系統中的設備驅動程序提供了統一的參考框架。
1 WDM系統函數
WDM 驅動程序包含了許多子例程,操作系統通過調用相關例程來執行針對I/O 請求包的各種操作[1]。WDM 驅動程序可執行包中的內容如下:
1.1 基本驅動程序與設備操作
DrvierEntry、 AddDevice
① DriverEntry例程負責初始化程序范圍的數據結構和資源。
② AddDevice例程是被系統調用,進行初始化一個被枚舉的新設備。
1.2 I/O 控制
DpcForIsr、OnInterrupt、StartIo、AdapterControl
① StartIo例程進行串行處理,對IRP進行排隊。
② AdaperControl例程負責執行DMA 傳輸。
③ OnInterrupt是一個中斷服務例程。
④ DPC是一個延遲過程調用例程。
1.3 派發功能函數
DispatchWriter、DispatchRead、DispatchWmi、DispatchPnp DispatchPower
Dispatch為調度例程,負責處理應用程序與驅動程序之間的通信,包括Writer,Read等,開發人員必須選擇特定驅動中需要的例程。
1.4 設備的創建和初始化
1) 內核模式驅動程序沒有main或WinMain,而是由I/O管理器根據需要調用一個驅動程序例程:① 驅動程序被裝入時;② 驅動程序被卸出或系統關閉時;③ 用戶程序發出I/O系統服務調用時;④ 共享硬件資源對驅動程序可用時;⑤ 設備操作過程中的任何時候。
2) 相關內容:① 所有驅動程序必須包含DriverEntry例程,進行驅動程序初始化。② 利用AddDevice函數負責創建一個設備對象,并建立一個私有的設備擴展對象。③ 給出設備名并創建符號連接名或者注冊設備接口。④ 初始化設備擴展和設備對象的標志位。⑤ 把新設備對象附著到設備堆棧中。
2 硬件的訪問及資源分配
PnP管理器使用IRP來指導驅動程序啟動、停止和刪除設備,并查詢驅動程序的設備,WDM是PnP驅動程序,必須具備PnP例程。IRP是DDK定義的一個數據結構。當驅動程序接收到PnP子碼IRP_MN_START_DEVICE 時,IRP堆棧列表內的兩個字段AllocatedResourcesTranslated 和AllocatedResources,列出分配的資源。
用來描述這些資源的結構是CM_PARTIAL_RESOURCE_LIST 類型,它包括一個CM_PARTIAL_RESOURCE_DESCRIPTOR 結構的計數數組。
數組中每一個資源描述符都有一個Type 成員[3],它表示所代表的資源的類型。主要有4個重要的共同體類型是Port(端口)、Interrupt(中斷)、Memory(內存)、Dma(直接內存訪問)。得到了設備的I/O地址,就可以對設備進行讀取了,在讀寫端口地址和內存時應該使用標準的內核讀取例程,在WDM 中應使用HAL宏等。這樣就可以不用考慮不同操作平臺的特性,也可以更好的適應Windows 2000 多任務,多進程環境的要求。
在分配硬件資源時,首先必須編輯安裝文件(inf文件),它包含了WDM 設備驅動程序的制造商信息、要復制的文件列表、要創建的注冊表項等。INF 安裝文件向操作系統添加了硬件資源。當驅動程序收到IRP_MJ_PNP 的IRP_MN_START_DEVICE 的子碼時,驅動程序獲得設備的硬件資源。
3 動態鏈接庫(.dll)
雖然驅動程序是為設備硬件層編程服務的,但同樣需要和應用程序進行通信,從而最終達到應用程序控制設備的目的。
通常情況下,應用程序通過專用的API 函數操作硬件,但由于這些函數攜帶參數很多,使用起來并不方便,因此可以另外開發一套用于中轉數據的功能函數集(動態鏈接庫),可以使得底層驅動設備對用戶是透明的[2]。采用這種分層結構,應用程序通過動態鏈接庫(.dll)來存取I/O設備。動態鏈接庫(.dll)提供給應用程序最常用的接口函數,包括設備初始化,關閉設備,存取端口等。在應用程序中加入特定的動態鏈接庫可以很方便的操作端口,并且可以重復使用,縮短了開發周期。
4 結束語
WDM驅動程序模型具有較好的可移植性:編寫驅動程序時,WDM規定只使用ANSI C標準規定的語言元素;硬件和軟件的可配置性靈活:使用HAL工具調用低級總線驅動程序或實現一個標準控制接口,避免直接引用硬件;使用注冊表作為配置信息的容器;可運行在多處理器平臺上?;?WDM 驅動模型設計的驅動程序可以穩定地在Windows 2000/XP/NT下運行,可以更好的實現分布式的數據監測和控制。
參考文獻:
[1] 武安河.WDM設備驅動程序開發[M].北京:電子工業出版社,2003.
[2] Cant C.Writing Windows WDM Device Drivers[M].孫義,譯.北京:機械工業出版社,2007.
[3] 李建.Windows2000下I/O設備驅動程序設計[D].北京:北方交通大學,2003.
0、引言
“面向對象程序設計”是軟件工程專業和計算機科學與技術專業的一門專業核心課程。該課程是軟件工程等課程的先修課程,同時又是進行軟件開發的直接工具,是把所學的專業知識轉化為應用的橋梁,是學生就業專業知識的關鍵技術,所以該課程在整個教學體系中占據非常重要的地位。目前該課程在教學中仍普遍采用傳統的以語法講授為主線的課堂教學模式,從而導致學生學習該課程的主動性和積極性不高,缺乏知識運用和解決實際問題的能力,教學效果也不理想。針對目前“面向對象程序設計”課程教學中存在的問題,課程組將基于項目的教學方法應用于該課程的教學實踐,并取得了初步成效。筆者從教學目標、教學內容、教學方法和手段、教學組織和教學評價等幾個方面介紹項目驅動在“面向對象程序設計”課程教學改革中的應用,并希望可以與工作在教學改革第一線的教學同行進行交流和探討。
1、項目驅動教學的理論基礎與認知研究
1.1 目前課程教學中存在的問題
面向對象程序設計(OOP)是一種全新的程序設計思想。但目前該課程大都以演繹的方式來教授,教學中存在重語言介紹、輕對象思想和方法傳授的情況,即在教學內容的組織上是以特定的面向對象程序設計語言結構組織的,從基本語言要素、語法和語句結構組織,然后再舉一些例子說明這些語句的應用,而這些例子都是一些語言語法層面上的簡單應用,很少涉及實際問題的解決。這種教學方式不僅不利于學生領會和理解面向對象的思想和方法,更不利于培養學生使用面向對象方法解決實際問題能力。
1.2 建構主義
工程與科學教學中主要采用的演繹式教學法將課程或知識點作為學科內一個自成系統的知識體系來處理。教師按照從一般原理到數學模型再到模型應用這樣的方式進行教學,很少會提到為什么要這樣做,以及這樣的模型可以用來解決什么實際問題,學生為什么要學習這些東西等,而學生的任務就是被動地吸收這些知識。
在教育心理學中有一個公認的準則,就是只有當人們清楚地意識到有必要去了解某個事物時,他才會最為強烈地去主動學習。如果只是告訴學生某項知識或技能在日后會用得到,并不能起到有效的激勵作用。
與傳統教育模式不同的建構主義認為學生的學習是將新的信息納入到自己已有的認知框架中。因此,教育應該從學生可能熟悉的內容與經歷出發,與學生已有的知識結構聯系起來。教學內容應該與實際應用有關,并與其他知識領域相關聯,而不應是抽象的或獨立的。教育者要創造條件引導學生自行建構知識,并從實踐經歷中獲得證據來修正自己的知識建構。
建構主義支持歸納式的教學,即教學不是從一般原理到應用,而是首先從具體事物出發,提出一個有待解決的實際問題;然后教師在學生解決問題的過程中向學生提供所需的信息,幫助學生把握事實、了解規則、知道程序、明白原理。項目驅動的教學也是歸納式教學的一種。
1.3 認知研究
心理學與神經學方面的研究對歸納式的項目驅動教學提供了強有力的支持。
布蘭斯福德(Bmnsf-ord)等人在文獻中指出:“凡是新的學習都涉及先前學習所得信息的轉移”,即學生對新知識的接受程度受已有知識的影響是很強的。如果新知識與學生已有知識或認知有聯系或一致的話,學生學習起來較容易。項目驅動教學是在學生能聯系起來的情景、問題或應用的背景下提出新的知識。因此,這樣的教學內容能夠與學生已有的認知結構結合起來,是有易于學生接受的。
學生的學習動機會影響到學生愿意投入學習的時間的多少。如果學生發現學習的東西有用,而且能夠用來做一些對別人有影響的事情的話,學習就會更有積極性。項目驅動的教學通過與實際應用相關的項目來提供一門課程的教學內容與技能。學生在學習的過程中能夠親身體會到所學知識的實用性。因此,這樣的教學方法能夠大大增進學生學習的積極性。
此外,如果教學環境與實際工作環境相似,學生在日后就能夠很容易地將課程所學得的知識與技能移用到實際工作場景中。項目驅動的教學圍繞真實的項目來組織教學,因此有助于彌補學生的學習環境與實際工作環境兩者之間的不一致,從而有利于學生將所學的東西應用到實際工作中去。
綜上所述,把項目驅動教學應用于“面向對象程序設計”課程的教學中,能夠激發學生的學習興趣,有效地提高學生學習的積極性和主動性,改善教學效果,并有利于學生的職業素質和能力的培養。
2、項目驅動教學的應用
課程組將項目驅動的教學模式應用于“面向對象程序設計”課程的教學過程中,教學以項目為核心,學生為主體。教師在教學中起主導作用,將軟件工程化思想融入到教學內容中,以軟件產品的生產周期作為課程內容的主框架,教學內容包括若干個不同層次的軟件項目,通過項目引出知識點。項目驅動教學模式在課程教學中的應用激發學生動手實踐和分析思考,提高了學生的綜合應用能力。
下面從教學內容、教學方法和手段、教學組織和教學評價等方面介紹將項目驅動教學應用于“面向對象程序設計”課程改革的具體做法。
2.1 基于項目驅動的教學內容改革
課程組通過選用國外原版經典教材,引進國外的先進教學理念,依據課程教學大綱,以職業活動為導向,以學生為教學主體,以項目為中心,對課程教學內容進行整合、序化,構建了模塊化課程結構,如圖1所示。該結構將課程內容劃分為4個模塊:語言基礎、面向對象程序設計基礎、面向對象程序設計的方法理論和開發應用,并細化每個模塊的知識點和職業素質、技能和能力培養的要求,突出面向對象程序設計的方法理論和開發應用,著重培養學生的職業素養、主動學習和創新的能力。
在上述4個教學模塊中,教學內容是按項目驅動的。在講授課程內容時直接從面向對象程序設計入手,將語言基礎的知識分散到其他模塊中進行講解。在2、3、4級模塊中,通過項目來詳細展示每個單元的重要理論和概念,所涉及的語法知識會隨著解決問題的需要而引入。基于項目驅動教學的2、3、4級模塊所包含的項目如圖2所示。
項目驅動教學實施的關鍵在于項目的設計與選取。教學項目的設計與選取遵循有的放矢、與實際應用相關聯的原則。同時項目的難易程度要以不將學生逼到其“最近發展區(Zone ofProximal development)”之外為原則,即選擇的項目要比學生可以獨立完成的項目難一些,但是在教師指導下或與其他學生合作能夠完成。
2.2 基于項目驅動的教學方法改革
根據軟件設計開發的工程性特點,“面向對象程序設計”課程的教學靈活地運用了“基于項目的教學方法”,突出了“理論教學構筑學生的知識結構,實踐教學構筑學生的職業技能結構”的教學原則,并將面向對象程序設計的基本原理、軟件編程的基本規范和軟件設計建模的教學完全地融合在一起。
項目驅動教學法與傳統的教學法相比,有很大的區別,主要表現在改變了傳統的3個中心,將以“教師”為中心轉變為以“學生”為中心,以“知識體系”為中心轉變為以“項目”為中心,以“理論講解”為中心轉變為以“項目實踐”為中心。在教學過程中,學生可以參與軟件產品的構思、設計、實施和運行,這給學生創造了感知軟件、動手實踐、分析思考的機會。通過解決問題,學生的學習興趣被激發,基本的工程素質和能力得到了培養。“基于項目的教學方法”目的在于創造條件引導學生通過親自參與,自行構建知識,而不是簡單地接受教師的詮釋。
2.3 教學評價和考核方法改革
項目驅動教學重在知識的應用與集成,因此教學的考核與評價要強調對概念的理解,重視對知識、技能學習過程的評價,關注實踐環節及工程應用能力,應對學生進行多視角、多方位的綜合測評,力求知識與能力的協調統一和考核評價的客觀與公正。課程組將考試形式由筆試改為機試,并增加課程設計考核環節。學生最終成績的評定方法是:機試占20%,日常表現(出勤率、作業與實驗成績)占20%,自我評價與同學生評價占10%,項目設計和參與程度占20%,答辯情況占20%,撰寫論文或報告占10%??己诵问降母母飼龑W生在課程學習中注重編程能力和解決問題能力的培養。
3、項目驅動在教學中的應用效果與評價
從2009~2010學年的第一學期開始,課程組將項目驅動應用于“面向對象程序設計”的課程教學中。通過與傳統教學進行對比,我們得出以下兩方面的結論。
3.1 項目驅動對教學產生的正面效果
項目驅動教學增進了學生在概念理解方面的思維能力,增強了學生分析問題、解決問題的能力,能夠有效地調動學生學習的積極性,提高學習的責任心,改善了學生與學生、教師與學生之間的互動關系,在學生的團隊合作與溝通能力培養方面起到積極的作用,特別是對于那些學習風格不適于傳統課堂授課的學生的教學效果特別好。
3.2 項目驅動教學在應用中存在的問題
項目驅動教學并不是一種很容易開展的教學。從教師方面而言,該方法要求教師對課程知識的把握程度要深,要有豐富的教學經驗,能夠根據教學情況隨機應變。就學生方面而言,基于項目的教學方法要求學生對自身的學習負有更多的責任。在項目實施過程中,各種項目管理與人際沖突等問題還會出現,這些都是學生所不習慣的,同時也對教師的教學組織能力提出了更高的要求。因此,有些教師和學生在一開始會對它感到不適應,在學習過程中也會出現兩極分化現象。此外,如文獻中所描述的,基于項目的教學容易產生內容知識方面的空白,忽視和遺漏一些關鍵知識點,從而影響學生今后對一些重要內容的進一步學習。
關鍵詞:C#程序設計;任務驅動;工作過程;共享資源;課程開發
1 引言
程序設計是一項實踐性很強的活動,項目的完成,需要整合各個知識點,還需要具備綜合應用知識的能力?!禖#程序設計》是我校計算機應用專業的一門核心課程,2008年立項為院精品課程,2010年立項為浙江省精品課程。本課程幾年來完成了基于工作過程的課程開發,課程開發遵循了趙志群教授所講的工學結合課程的基本原則:學生通過對技術(或服務)工作的任務、過程和環境進行整體化的感悟和反思,實現知識與技能、過程與方法、情感態度與價值觀學習的統一。課程從提出一個具體的應用項目的需求開始,到最終完成項目開發交給用戶為止,通過若干相對獨立而又逐步發展的任務組織知識點,每一個任務都是先提出要解決的問題,然后明確目標和解決問題的步驟,在.NET Framework基礎上,運用Visual C#進行面向對象的程序設計,充分利用面向對象的封裝性、繼承性和多態性等特性實現項目,步步為營,逐步發展,給學生持續的動力、興趣和成就感。課程開發側重工學結合,知識和能力的統一。
2 課程開發的主要步驟
2.1 尋找一系列具有典型意義的綜合性的工作任務
以就業為導向是課程體系設置核心的特征。職業教育的本質就是就業教育,學習的目標就是為了就業,有助于就業的我們就學、并且學精,無助于就業的我們就不學。為了能夠滿足就業的需求,我們做的第一件事情就是去軟件開發企業了解用人狀況和技術需求,通過對掌握的一手數據進行詳細分析和多次專家研討,比較全面地掌握企業用人需求。尋找一系列具有典型意義的綜合性的工作任務。
整體化的工作分析的結果不是獨立的、點狀的“能力點”或者“技能點”,而是過程完整的“典型工作任務”。
2.2 在典型工作任務的基礎上設計學習領域課程及其學習任務
學習情境的載體是一個“學習與工作任務”,即“內容是工作的學習任務”,“用于學習的工作任務”,簡稱“學習任務”或“學習性任務”。
學習任務是學習情境的物質化表現,它來源于企業生產或服務實踐,能夠建立起學習和工作的直接聯系,但并不一定是企業真實工作任務的忠實再現。
軟件開發領域內所涉及到的技術內容是非常多的,不同的行業會使用不同的技術,不同的項目也會使用不同的技術,在技術選擇上我們遵循實用原則:所選擇的技術一定是能夠解決實際工作中的實際問題的技術。課程主要內容集中在如何解決軟件開發項目中所涉及到的技術工具、技術框架、開發流程和編碼調試經驗等方面?!安灰ケ痴b對象有哪些方法、屬性,而是要去使用這個對象去解決實際問題”。
課程內容的安排要以學習任務為中心來開展,并適當地把多個學習任務聯結成一個工程項目。在每一個學習領域課程中,都采用一個實際的開發項目來組織技術內容,課上老師會通過項目的講解來引出技術內容,而上機課要求同學自己逐步完成一個類似的項目。
在項目的選擇上,在考慮到項目的實用性的同時,也盡可能地提高項目的趣味性、并加強與日常生活中遇到的問題和現象的 聯系,從而幫助同學理解項目內容。
2.3 課程學習任務舉例
課程體系中典型工作任務之一:開發三層結構數據庫應用程序。
學習任務1:用三層結構實現不同類型用戶登錄考試管理系統(應用面向對象實現三層結構數據庫應用程序的開發)。
子任務1:完成管理員窗體的登錄。
子任務2:完成學員窗體的登錄。
首先教師指導學生實現管理員窗體的登錄過程,項目在三層結構的基礎上具體實現步驟如下:
(1)實現業務實體層。包括新增實體層項目、添加其它項目對實體項目的引用、添加數據表對應的實體類、編寫實體類。(2)設計用戶界面。(3)實現數據訪問層。(4)實現業務邏輯層。(5)實現表示層數據綁定。
關鍵技術:使用實體類消除關系數據與類之間的差別,通過將關系數據封裝成實體對象,用實體對象實現三層結構中數據傳遞的載體。見圖1。
運行完成的應用系統,首先進入系統登錄窗體。見圖2。
學生在數據庫管理員表中找到存在的用戶名及密碼并輸入登錄窗體,選擇用戶類別為管理員,進入管理員窗體界面。至此完成管理員窗體的登錄,學生已有了小小的成就感,接下來讓學生獨立完成子任務2:完成學員窗體的登錄,同時培養了學生對知識的再學習能力。
學習任務2:用實體類實現教員賬戶創建、實現教員信息預覽、編輯。
子任務1:用實體類實現教員賬戶創建。
子任務2:用實體類實現教員信息預覽。
子任務3:用實體類實現教員信息編輯。
2.4 基于“共享型教學資源”的教學模式
創建基于共享型教學資源平臺,建成以“共享型教學資源庫”為核心,以“開放型教學平臺”為載體,具有行業企業參與、滿足廣大師生自我學習和自我提高、滿足服務地方經濟需要為一體的具有高可用性、開放性、共享性、伸縮性和可靠性的教學資源共享、管理和服務平臺。
基于“共享型教學資源”的高職教學平臺能使高職院校和企業間的需求信息及時、順利地對接,使學校能充分尊重學生職業生涯的發展需求,充分調動學生學習技術業務的自覺性,大力營造崗位成才的環境和氛圍,使學生盡快適應企業的環境,實現向“社會人”和“職業人”的轉變。做到學校出人才、企業用人才、學生實現崗位成才。
基于“共享型教學資源”的高職教學平臺強調在線學習,重視發揮學生的主體作用,指導學生利用教學平臺自主探究,引導學生進行發現學習。
教師利用平臺整合教學資源,提出學習任務,引導學生學習新知識。運用自主學習與協作學習相結合的方式進行探究式學習,對任務進行交流與討論,通過協作完成并在線提交任務。教師和企業專家給出任務評價標準,并做為課程考核的重要評價指標之一。
3 總結
浙江省教育廳廳長劉希平說:“我們應該高度重視課程開發,尤其是二次開發。我們應該鼓勵和要求教師在教學過程中進行二次開發,即對已有的課程,教師應根據自己的理解、研究,針對學生的實際,進行一些教學創新。教師只有對教材有獨特的理解、系統的分析,才能夠把課教得生動,教得有針對性?!?/p>
本門課程的教學團隊經過幾年的教學實踐,針對學生的實際,對課程進行了二次開發,將一個大的項目分解成幾個小的學習任務,再分解成幾個子任務,明確提出任務的需求和目標,給學生持續的動力、興趣和成就感。
在項目實施過程中,根據需要進行分組,以組為單位完成任務,學生的收獲既有交流中的炫耀引發的自豪感,又有互通有無、相互學習、相互補充中對知識的逐步完善。通過項目教學能夠更好地促進學生實踐能力和綜合素質的提高。
在今后的教學中要繼續完善《基于共享型教學平臺》的建設,使學生通過這個平臺能更好地了解企業需求,并學會自主學習,能完成平臺提出的相應任務需求,為社會、企業不斷創造價值,真正實現崗位成才。
參考文獻
[1]北京阿博泰克北大青鳥信息技術有限公司.在.NET框架下開發三層結構數據庫應用系統[M].北京:科學技術文獻出版社,2008.
[關鍵詞]項目驅動 實踐應用 教學改革
[作者簡介]湯海蓉(1974-),女,湖南常德人,湖南文理學院計算機學院,講師,碩士,主要研究方向為數據庫、計算機教育。(湖南 常德 415000)李錫輝(1974-),女,湖南望城人,湖南信息職業技術學院,副教授,碩士,主要研究方向為WEB應用開發,視頻圖像處理。(湖南 長沙 410200)
[中圖分類號]G642 [文獻標識碼]A [文章編號]1004-3985(2012)06-0140-03
在互聯網時代,JAVA語言已經是使用最廣泛的編程語言之一。由于免費、跨平臺、語言本身技術先進,它已經成為許多學科研究、課程和計算的首選語言。有關資料顯示,IT人才屬國內人才緊缺指數較高的一類,優秀的JAVA編程人員更是尤其缺乏。隨著3G、物聯網時代的到來,JAVA語言不僅不會“過時”,相反,它將會在新的業務領域有著更輝煌的發展前景。正因如此,目前各類高校均將JAVA作為計算機專業的主要教學語言之一,通過學習,學生可以獲得一定的編程能力,鍛煉自己的邏輯思維,為將來的就業打好基礎。
一、JAVA語言目前教學中存在的問題
傳統實踐教學中,由于受諸多因素的影響,教學效果不甚理想。具體表現在:
1 教學手法單一。傳統的教學是以教師、教材為中心。教師負責教,學生負責學,教材怎么寫,教師就怎么講,學生就怎么學。一般方法是教師根據大綱和教材,針對某個知識點進行重點講授,列舉若干驗證性的實驗加以佐證,學生亦通過上機編寫一些小的算法,對課堂上的某一到兩個知識點加以理解和吸收。一定程度上忽視了學生作為學習主體的存在,忽視了JA―VA語言具有極強實踐性的特征,使學生喪失了學習的積極性、自主性和創造性。
2 學生對課程的難度認識不夠。源于JAVA在行業中的廣泛應用,許多學生初次接觸JAVA,對學成之后的前景是非常期待的,因而興趣十分濃厚,又由于有C及C++語言的基礎,會認為不過是C++的向上封裝。但隨著學習的深入,面對大量不斷涌現的各類環境配置、OOP思想、類庫、乃至設計模式、架構等,繁多而枯燥,在沒有實際成果激勵的情況下,無法達到原來的預期,就會產生畏難心理,進而影響后續的學習。
3 實踐能力差。傳統教學模式下培養出的學生,被動接受知識,理論掌握得較好,也能在實驗中實現一些孤立算法,各個知識點之間沒有建立相關串聯,一旦被要求完成一個實際的完整項目時,則會茫然得不知從何下手。更不用說運用軟件工程的思想進行開發和團隊合作了。
4 考核標準單一。傳統教學對學生的考核是通過筆試完成的,掌握了教師所交給的課本知識,通過記憶,考試就能夠取得好成績,學校對教師的評價也基本上是看教學成績,使部分學生產生了只要背背知識點通過考試就行、實踐無所謂的錯誤傾向。這種重結果而不重過程。重考試成績而不重全面發展的考核方式,不能充分地發揮出考核作為指導教學、檢驗學生學習能力的指揮棒作用。
以上諸多問題究其根源是學生學習動力的缺乏,解決的辦法就在于激發其學習興趣和信心,最好的途徑就是能夠讓學生自己動手解決實際問題,讓其能力得到肯定和承認,讓其體會到成功的快樂,從而增強學習動力。針對于此,有必要對傳統的課程教學模式進行改革,經過不斷實踐,筆者在教學中總結了一套行之有效的基于項目驅動的教學方法。
二、基于項目驅動的教學法
基于項目驅動的教學法是指根據大綱所規定的教學內容、教學目的和教學要求,將一個實際管理活動中與課程相關的內容,加以收集、歸納、整理,形成項目任務。依托這些資料,教師通過巧妙設計教學內容,深入淺出地講解知識點,形象地指導學生實施理論聯系實際,讓學生通過完成項目來達到掌握知識的目的。學生在強烈的問題動機驅動下,通過對教學資源的主動應用,進行自主探索和互動協作,根據項目要求進行需求分析、數據庫設計、代碼編寫以及測試,針對項目中各種實際問題,獨立思考,協同探索,研究解決問題的方法,通過實踐實現目標,提高概括分析問題、解決實際問題以及編程的能力。
基于項目驅動的教學目的是以學生為中心,但不是要求學生只會解釋問題,而是要培養學生具有解決實際問題的能力,解決“干什么”“怎么干”的問題。強調以直接經驗的形式來掌握融合在各實踐活動中的最新知識、技能和技巧。在項目教學中,學生不但學習了新知識,更學會了探究解決問題的一般研究規律和方法,這為學生分析新的項目,達到舉一反三的目標,打下了良好的專業基礎,讓其能在將來的工作中,很快進入角色。
三、具體操作
經過實踐總結,筆者將項目驅動教學的過程劃分成以下幾個步驟,具體如圖1所示:
1 確定項目。課程學習開始之初,先選取一個與學生聯系較為緊密的實際項目,比如學生管理系統、網上商城等。項目的選擇要求如下:(1)具有典型性、符合實際;(2)項目設計的問題具有啟發性,符合教學的要求;(3)符合教學目標的需要;(4)內容的深淺應符合學生學習的需求;(5)項目的設計應體現知識的系統性和整合性。以學生管理系統為例,首先將教師在以往工作中編寫的系統運行展示給學生,讓其大致了解將來要求設計完成的效果,激起學生的興趣,然后有的放矢地設計自己的目標項目。
2 任務劃分及小組分工。根據軟件工程的思想,以項目功能模塊為單位進行小組劃分,并選定小組負責人,培養團隊精神。具體劃分見圖2。在項目的需求分析階段,小組成員可以通過集體討論,集思廣益,給出設計方案;在設計過程中,由組長安排各成員的分工協作,確定每人所承擔的任務。成員可以輪流承擔各階段的設計、編碼和測試任務,使學生在過程中扮演不同的角色,培養各方面的能力,加強與他人的溝通;要求每個小組既要實現獨立的子系統的功能,又應當與其他小組建立聯系,最后要求整合以共同完成整個項目。
3 教學安排。在教學過程中,教師要對教材上的知識點進行重新組織和安排。不是不加選擇地從頭講到尾,而是根據知識點的難易程度、實用性以及與實踐項目的關系密切程度,有選擇地進行講解。由于前期已有相關課程的學習基礎,比如在C++課程中已經學習了OOP的思想及相關語法知識,只需對其差異部分稍加講解;數據庫相關知識的掌握,使得學生可以較早著手分析和數據庫相關的內容,進行概念結構設計和邏輯結構設計。另外,針對教材一般只定位于J2SE中的一部分基礎知識,根據項目實踐需要以及學生的能力水平,還需將一部分高級和擴展部分內容穿插到課堂和實踐中,如網絡編程、系統的邏輯架構及物理架構的設計等,以幫助學生提高項目實踐能力。部分教學安排見下表:
4 過程指導。在項目進行過程中,主要依靠學生自身的能力和團隊的協作,通過查閱資料及網絡自主學習,以團隊為單位
獨立解決遇到的困難;教師亦必須全程指導、策劃,協調各個子項目之間的協同進展,通過多種教學手段答疑解惑,如推薦網絡版教程、Email答疑、QQ群集體討論、定期當面探討等,對設計過程中可能遇到的較深入的知識點進行有效學習指導,在項目的一些關鍵階段進行適當的點評,并對設計過程中出現的偏差及時糾正,鼓勵學生獨立思考和團隊協作,引導學生變注重知識為注重能力,使他們完善設計,促進自身的不斷提高。
5 綜合評估。學期結束,需要對完成的較完整的項目進行檢查與評價。首先應由學生對自己的工作進行評定,闡述包括在項目準備、具體設計、測試過程中碰到的各種疑難問題、解決的手法以及結果如何,總結團隊合作的感受,并對本組負責的模塊的運行效果加以點評。教師最后進行工作總結,總結團隊中各成員在設計過程中的分工和職能的完成情況,依據各組負責模塊的難易程度、總體完成情況、個人對團隊的貢獻等因素進行綜合評判,給出學生的實踐能力成績,找出差距與改正方法,并最終納入到課程考核成績中。最后,還應指導學生分組撰寫實踐報告。
6 教學效果分析?;陧椖康慕虒W實施之后,與上一學年的學長相比,本學年的學生的學習積極性明顯提高,學生不僅積極完成課堂上的任務,同時也開始自主學習,積極組織及參與各種形式的討論,課后提問明顯增多,學習氣氛濃厚。同時。學生開發編寫的代碼數量和質量有了質的提升,并對于一些較為深入的內容也有所主動涉及,如設計模式等,真正實現了“學為所用”和“學以致用”。此外,在設計過程中還培養了團隊協作精神和集體榮譽感,鍛煉了溝通能力和合作意識。而對于設計過程中不斷出現的新問題和新思路,也促使教師加深思考,根據不同學生的不同理解補充新的教學內容,教學相長。
四、項目教學中應注意的問題
1 正確處理項目教學與傳統課堂講授教學的關系。項目教學并不能完全取代傳統課堂講授,教師對一門學科的重點和難點進行適當講授,是教學中不能缺少的。另一方面,課堂講授應當是誘導式的、啟發式的,應與項目教學結合起來,只有把兩者有機地結合起來才能取得更好的效果。因此,項目教學的優勢是明顯的,但也不是完美無缺的,我們應在教學中充分發揮項目教學與傳統講授各自的優勢,取長補短,培養適應社會發展的實用型人才。
2 正確處理項目教學與其他教學手段的關系。在教學過程中,除了項目教學、傳統講授教學以外,還有許多其他教學手段,例如模擬實驗等手段,對于學生各方面知識與技能的培養都是非常有利的。因此,在教學過程中,我們不能囿于項目教學與傳統講授兩種方法,應該根據課程內容的不同特點。選擇不同的教學方法,以此激發學生的學習熱情。
3 項目教學對教師和學生都提出了更新、更多的要求。教師必須具備完成一個項目所需的全部理論知識和專業技能,尋找到一個能覆蓋學生學習領域所涉及的全部或絕大多數內容的合適項目,必須充分收集、熟悉、掌握相關資料。并從中歸納要點,提供分析、討論的框架,必須做大量的準備工作以應對學生可能提出的各種問題,還要求教師具有很強的調控能力。從學生方面來看,再不能像以前那樣被動地接受“滿堂灌”,而必須充分發揮自己的主動性,查閱大量參考資料。提前預習,發現問題,與他人合作,開展調查研究,提出解決問題的對策,運用適當的方法和手段,表達、交流、反思自己學習和設計的見解及成果。
關鍵詞:嵌入式系統;linux;驅動程序
引言
Linux是一個遵循POSIX標準的免費操作系統。具有BSD和SYSV的擴展特性。與其他操作系統相比,嵌入式Linux系統以其可應用于多種硬件平臺、內核高效穩定、源碼開放、軟件豐富、網絡通信和文件管理機制完善等優良特性而正被作為研究熱點,越來越多的研究人員采用Linux平臺來開發自己的產品。Linux設備驅動程序在Linux內核源代碼中占有很大比例,從2.0、2.2到2.4版本的內核,源代碼的長度日益增加,其實主要是設備驅動程序在增加。
設備驅動程序的編寫
設備驅動程序是linux內核的一部分,是操作系統內核和機器硬件之間的接口,它由一組函數和一些私有數據組成,是連接應用程序與具體硬件的橋梁。Linux的一個基本特點是它對硬件設備的管理抽象化,系統中的每一個設備都用一個特殊的文件來表示。所有的硬件設備都像普通的文件一樣看待,使用與操作系統相同的標準系統來進行打開、讀寫和關閉。
在Linux操作系統下有3類主要的設備文件類型:塊設備、字符設備、網絡設備。字符設備是指存取時沒有緩存的設備。可像文件一樣訪問字符設備,字符設備驅動程序負責實現這些行為。系統的控制臺和并口就是字符設備的例子,它們可以很好地用“流”來描述。塊設備是文件系統的宿主,如磁盤。Linux允許像字符設備那樣讀取塊設備――允許一次傳輸任意數目的字節。結果是,字符設備和塊設備讀取數方式一致。而網絡設備不同于字符設備和塊設備,它面向的上一層不是文件系統而是網絡協議層,是通過BSD套接口訪問數據。與設備相對應的是三類設備驅動程序,字符設備驅動程序、塊設備驅動程序、網絡設備驅動程序。
字符設備驅動程序、塊設備驅動程序與網絡設備驅動程序的結構體是不同的。
在linux源代碼linux/include/linux/fs.h中定義了字符設備和塊設備驅動程序中必須使用的file_operations結構,每個設備驅動都實現這個接口所定義的部分或全部函數。隨著內核的不斷升級,file_operations結構也越來越大,不同的版本的內核會稍有不同。
應用程序只有通過對設備文件的open、release、read、write、ioctl等才能訪問字符設備和塊設備。用戶自己定義好file_operations結構后,編寫出設備實際所需要的各操作函數,對于不需要的操作函數用NULL初始化,這些操作函數將被注冊到內核,當應用程序對設備相應的設備文件進行文件操作時,內核會找到相應的操作函數,并進行調用。如果操作函數使用NULL,操作函數就進行默認處理。
對于字符設備而言,llseek(),read(),write(),ioctl(),open(),release()這些函數是不可缺的;對十塊設備,open(),release(),ioctl(),check_media_change(),revalidate()是不可缺少的。
網絡設備結構體net_device定義在include\linuxhletdevice.h里,如下所示:
定義好net_device結構體后,根據實際情況編寫操作函數,其中hard_start_xmit()函數是用來發送數據的,set mac address()是進行網絡參數設置的。
當linux初始化時將調用初始化函數intdevice_init(),該函數包括以下內容:
注冊所用設備。linux用設備號來標識字符設備和塊設備。設備號分為主設備號和從設備號,最終形成設備接點。設備節點在訪問字符設備和塊設備的設備驅動程序時將使用。通常主設備號標識設備對應的驅動程序,大多數設備是“一個主設備號對應一個驅動程序”,如:虛擬控制臺和串口終端由驅動程序4管理。次設備號由內核使用,用于確定設備文件所指的設備。字符設備和塊設備注冊時必須先定義好設備號。
字符設備注冊函數如下:
int register_chrdev(unsigned int major,constchar*name,struct file_oprations*fops);其中major是主設備號。
由于對網絡設備驅動程序的訪問不需要設備節點,它的注冊函數如下:
int register_netdev(struct net_device*dev)
注冊設備所用的中斷。中斷在現代計算機結構中有重要的地位,操作系統必須提供程序響應中斷的能力。一般是把一個中斷處理程序注冊到系統中去。操作系統在硬件中斷發生后調用驅動程序的處理程序。
注冊中斷所用的函數如下:其中,irq是中斷向量;handler是中斷處理函數;flags是中斷處理中的掩碼;devices是設備名;dev_id是在中斷共享使用的id。
當linux不使用該設備時,就要調用清除函
編寫服務子程序
服務于I/O請求的子程序,又稱為驅動程序的上半部分。調用這部分是由于系統調用的結果。這部分程序在執行的時候,系統仍認為是和進行調用的進程屬于同一個進程,只是用戶態變成了核心態,具有進行此系統調用的用戶程序的運行環境,因此可以在其中調用sleep等與進程運行環境有關的函數。
中斷服務子程序,又稱為驅動程序的下半部分。在Linux系統中,并不是直接從中斷向量表中調用設備驅動程序的中斷服務子程序,而是由Linux系統來接收硬件中斷,再由系統調用中斷服務子程序。中斷可以產生在任何一個進程運行的時候,因此在中斷服務程序被調用的時候,不能依賴于任何進程的狀態,也就不能調用任何與進程運行環境相關的函數。因為設備驅動程序一般支持同一類型的若干設備,所以一般在系統調用中斷服務程序的時候,都帶有一個或多個參數,以唯一標識請求服務的設備。
設備驅動程序的使用
直接將驅動程序編譯進linux內核
將設備驅動程序復制到linux/drivers相關的子目錄下,比如字符設備驅動程序就放在linux/drivers/char下。
修改linux/drivers相關的子目錄的Makefile,
如obj-$(config_dev_driver)+=dev_driver.o,這樣在編譯內核時將會編譯dev_driver.c,生成dev_driver.o.
對內核進行重新編譯時,進行相關的配置,比如要使用AT91RM9200的UART,就要如下配置:
Character devices->Serial drivers.>AT91RM9200 serial port suppot
將驅動程序編譯成驅動模塊
在設備驅動程序中要有兩個重要函數:
module_init(dev-init),module_exit(dev_exit)
利用相應的交叉編譯器以及編譯命令將驅動程序dev_driver.c編譯成dev_driver.o這樣的動態驅動模塊。利用insmod命令給系統安裝驅動模塊,如果在/dev目錄下沒有相應的設備文件,就可以使用mknod創建一個設備文件。利用rmmod命令卸載驅動模塊,設備文件的刪除可以用rm命令。